哪个用户可以使用setpgid()函数?

时间:2014-12-16 12:58:44

标签: c linux

当我执行此函数时,我为setpgid()计算了函数,结果将被拒绝。然后我以root用户身份登录该时间,这将打印错误消息,因为权限被拒绝。然后哪个用户可以使用此功能。有谁可以向我解释一下?

   #include<stdio.h>
   #include<unistd.h>
   #include<stdlib.h>

  main()
   {
    printf("parent pid=%d\tpgid=%d\n",getpid(),getpgid(getpid()));
    pid_t pid,pgid;
    pgid=getpgid(getpid());
    if((pid=fork())==0)
    {
            printf("befor sessionchild pid=%d\tpgid=%d\n",getpid(),getpgid(getpid()));
            sleep(5);
            pid_t p;
            printf("child pid=%d\tpgid=%d\n",getpid(),getpgid(getpid()));
            if((p=fork())==0){
                    sleep(2);
                    setsid();
                    printf("child2 pid=%d\tpgid=%d\n",getpid(),getpgid(getpid()));
                    setpgid(getpid(),pgid);
                    perror("Error");
                    printf("after setting group id child2 pid=%d\tpgid=%d\n",getpid(),getpgid(getpid()));
            }
            wait(0);
            exit(0);
    }
    exit(0);
  }                                        

2 个答案:

答案 0 :(得分:2)

首先,在致电perror()之前,您确实需要检查功能调用的返回值,否则您不知道哪些呼叫失败了 - 它可能不是最新的在失败的perror()语句之前调用。代码应该是这样的:

if (setpgid(getpid(),pgid) != 0) {
    perror("setpgid");
}

如果确实setpgid()失败了,那么docs说的是:

  

EPERM 尝试将流程移至流程组   在不同的会话中,或更改其中一个的进程组ID   呼唤过程的孩子和孩子是不同的                 会话,或更改会话负责人的进程组ID(setpgid(),setpgrp())。

因为您的孩子进程调用了setsid(),所以听起来您正在讨论第一个案例。

关于job control的glibc文档有关于此主题的一些阅读材料。

答案 1 :(得分:0)

这不是你应该如何进行错误处理。

检查每次 API调用的返回值,查找错误。

如果(且仅当)出现错误,则应检查errno并使用perror