【问题标题】:Linux change pgrp (process group) during c program executionc程序执行期间linux更改pgrp(进程组)
【发布时间】:2014-10-17 17:56:44
【问题描述】:

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

【问题讨论】:

    标签: c linux process grep


    【解决方案1】:

    来自 setsid 的手册页。

    http://linux.die.net/man/2/setsid

    setsid() 如果调用进程不是进程组负责人,则创建一个新会话。调用进程是新会话的leader,新进程组的进程组leader,没有控制终端。

    或者你可以通过 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;
    }
    

    【讨论】:

    • 试试测试程序,你会发现它不起作用
    • 那可能是因为你的进程已经是组长了。我不知道这是否可以解决您的问题,但您可以通过分叉您的进程来更改您的进程组 ID,让父进程死亡并在您的子进程中调用 setsid。这样,您的子进程将不会成为组长,并且会更改其组 ID。
    • 是的,例如,这是守护进程的方法,我对其进行了测试。我很好奇我是否可以在不分叉的情况下更改现有流程...
    • 最后一件事,所以我只能设置一个已经存在的 pgrp(具有相同的会话 id)。分配新的 pgrp 是不可能的,对吗?
    • 刚刚测试成功,如果我不是会话负责人,我可以使用 setpgrp() 或 setpgid(0,0) 将我的 pid 分配为 pgid。非常感谢你让我明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多