C Linux在程序执行期间更改pgrp(进程组)
在程序执行期间是否有一段可用的C代码可以更改您自己的进程组。 也许有人可以让测试程序在下面工作。
Bash验证:
# ps -opid,pgrp,cmd | grep <pid>
C测试程序:
#include<stdio.h>
int main(int argc, char *argv[]) {
pid_t mypid = getpid();
printf ("issue: ps -opid,pgrp,cmd | grep %d\n", (int) mypid);
printf ("will change my pgrp in 10 sec\n");
sleep (10);
// missing here is the "magic" statment to change current process group
printf ("issue: ps -opid,pgrp,cmd | grep %d\n", (int) pid);
sleep (1000);
}
答案 0 :(得分:4)
来自setsid的手册页。
http://linux.die.net/man/2/setsid
如果调用进程不是进程组负责人,setsid()会创建一个新会话。调用流程是新会话的领导者,新流程组的流程组负责人,并且没有控制终端。
或者您可以通过setpgid()系统调用更改您的进程组。对于setpgid的男人页面 http://man7.org/linux/man-pages/man2/setpgid.2.html
setpgid()将pid指定的进程的PGID设置为pgid。如果pid为零,则使用调用进程的进程ID。如果pgid为零,则pid指定的进程的PGID与其进程ID相同。
但强制要求两个进程组属于同一个会话,即您移动的组和您移动到的组。下面是使用setsid()和fork()更改进程组的代码示例:
int main()
{
pid_t ppgid = 0;
pid_t mypid = getpid();
pid_t ppid = getppid();
printf("My pid is %d and my pgid is %d\n", getpid(), getpgid(mypid));
ppgid = getpgid(ppid);
printf("My parent's pid is %d and his pgid is %d\n", ppid, ppgid);
setpgid(mypid, ppgid);
printf("Now my pgid is changed to my parent's pgid(%d)\n", getpgid(mypid));
return 0;
}