gpt4 book ai didi

c - 哪些用户可以使用 setpgid() 函数?

转载 作者:IT王子 更新时间:2023-10-29 00:38:14 32 4
gpt4 key购买 nike

当我执行这个函数时,我计算出了 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);
}

最佳答案

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

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

如果确实是 setpgid() 失败了,这就是 docs 的内容说:

EPERM An attempt was made to move a process into a process group in a different session, or to change the process group ID of one of the children of the calling process and the child was in a different session, or to change the process group ID of a session leader (setpgid(), setpgrp()).

所以听起来您遇到了自您的子进程调用 setsid() 以来所描述的第一个案例。

关于 job control 的 glibc 文档有一些关于这个主题的阅读 Material 。

关于c - 哪些用户可以使用 setpgid() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27505222/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com