当我执行此函数时,我为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);
}
答案 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
。