无法更改进程的gid

时间:2017-01-21 11:22:55

标签: c linux process fork

我需要更改父进程的PGID,所以我做了类似的事情:

limit

我得到#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define KIDS 10 int main() { struct timespec a = {10, 0}; int pid; int* pids = (int*) calloc(KIDS, sizeof(int)); int argument = 0; int procNumber; for (procNumber = 0; procNumber < KIDS; procNumber++) { pid = fork(); argument = procNumber; if (pid == 0) break; pids[procNumber] = pid; } if (pid == 0) { // child stuff } else { printf("My group: %d\n", getpgrp()); if (setpgid(0, 6654) == -1) perror("setpgid() error:"); printf("My new group: %d\n", getpgrp()); } nanosleep(&a,NULL); free(pids); return 0; } 错误。

如何避免此错误并更改流程的groupid?

2 个答案:

答案 0 :(得分:2)

Operation not permitted错误消息与EPERM错误代码相关联,根据man 2 setpgid(引用):

  

EPERM

     

尝试将流程移入流程组   一个不同的会话,或更改一个进程组ID   呼唤过程的孩子和孩子在一起   不同的会话,或者更改a的进程组ID   会话负责人(setpgid(),setpgrp())。

因此,对于您收到的错误,似乎有3种不同的解释:

  1. 您正在尝试将流程移至其他会话中的流程组。

  2. 您正在尝试更改处于不同会话中的孩子的PGID。

  3. 您正在尝试更改会话负责人的PGID。

  4. 案例2和3看起来与你的问题无关,所以我的猜测是你在第一种情况下。如果随机选择6654,则可能是进程组6654处于不同的会话中。

    您可以验证此运行$ ps eajx之类的内容,并检查所涉及的每个流程的输出的SID字段,包括流程组6654。

答案 1 :(得分:1)

if(setpgid(0,6654)==-1)
    perror("setpgid() error:");

我认为错误意味着“尝试将流程移动到不同会话中的流程组”

所以:

[root@localhost test_c]# sleep 10000 &
[2] 2922

我在我的终端启动了一个pid为2922的新进程,这意味着它的进程组ID也是2922。

然后我将源代码if(setpgid(0,6654)==-1)更改为if(setpgid(0,2922)==-1),一切正常。