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

标签 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);
  }                                        

最佳答案

首先,您确实需要在调用 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/

相关文章:

C 程序永远等待 scanf

Linux 中的客户端服务器应用程序读取时被阻止的代码

linux - 为什么 linux 路由配置在两个 NIC 冗余(主/辅)时失败?

c - 信号总是结束程序

c++ - 函数包装避免重复

C语言编程: the app wont stop after typing x

c++ - MingW C++ 编译器不工作

linux - 如何将 "watch"的输出保存到文件

c - 有没有办法从另一个进程向线程发送信号?

linux - 我必须编写一个自动化脚本