我需要更改父进程的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?
答案 0 :(得分:2)
Operation not permitted
错误消息与EPERM
错误代码相关联,根据man 2 setpgid
(引用):
EPERM
尝试将流程移入流程组 一个不同的会话,或更改一个进程组ID 呼唤过程的孩子和孩子在一起 不同的会话,或者更改a的进程组ID 会话负责人(setpgid(),setpgrp())。
因此,对于您收到的错误,似乎有3种不同的解释:
您正在尝试将流程移至其他会话中的流程组。
您正在尝试更改处于不同会话中的孩子的PGID。
您正在尝试更改会话负责人的PGID。
案例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)
,一切正常。