Linux在c程序执行期间更改pgrp(进程组)

时间:2014-10-17 17:56:45

标签: c linux process grep

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

1 个答案:

答案 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;
}