【问题标题】:Get child process id of already running process获取已运行进程的子进程ID
【发布时间】:2013-08-06 09:57:42
【问题描述】:

我正在调用一个外部程序(通过节点中的 pty.js),它在运行时会生成一个子进程。当父进程完成时,它会让子进程运行一段时间(孤儿)。我可以获取父进程的 id,但想获取生成的子进程的 id,以便在父进程退出时将其杀死。

我不相信 node 有任何方法可以实现这一点,所以 C 中有什么东西可以让你获取孩子的 id,只知道父 id。到目前为止,我发现的所有内容都与从 fork() 获取子 ID 相关,但 fork 发生在外部程序中。

或者,我想我可以调用 ps 或 pstree / 类似的东西并解析输出,但感觉有点像 hack。

编辑

这不太好,但到目前为止我已经想出了这个:

#include <limits.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
  int id = atoi(argv[1]);
  int i;
  for(i = 0; i < INT_MAX; i++) {
    if(i != id && getpgid(i) == id) {
      printf("Process %d, is a child of %d", i, id);
      break;
    }
  }
}

【问题讨论】:

    标签: c node.js process


    【解决方案1】:

    在 node.js 中,您可以通过 child_process 库来实现。有一个 pid 成员函数返回生成的孩子的 pid。例如

    var spawn = require('child_process').spawn,
        grep  = spawn('grep', ['ssh']);
    
    console.log('Spawned child pid: ' + grep.pid);
    grep.stdin.end();
    

    你也可以用kill杀死子进程。

    pty.js 使用伪终端进行分叉,这在模拟终端时很有用。否则,您应该使用child_process 来生成/派生新进程。

    【讨论】:

    • 我需要为这个程序模拟终端,所以不幸的是它必须使用 pty.js。
    【解决方案2】:

    如果您可以在父进程末尾添加此代码:

    int i ;
    while(1)
    {
        i = wait();//wait child exit
        if(i == -1)//if there is no child process 
           break;
    }
    

    如果你不能。那你什么都不用做!

    问题出在这里:

    如果父进程完成但子进程没有完成,则这些子进程称为:“孤儿进程NOT僵尸” . “僵尸进程”是指子进程在专利进程仍在运行时完成,并且父进程没有处理子进程的后果。

    由于系统会将“init”设置为所有“孤儿进程”的父进程。init 进程将处理一切。所以你什么都不用做。!!

    【讨论】:

    • @gratz 我已经修改了我的 anwser。现在我认为你什么都不用做。 :)
    • 最终孤儿被清理了,但这可能需要很长时间。我添加了对 OP 的更新,我将对其进行更多测试。
    猜你喜欢
    • 2017-05-23
    • 2011-07-16
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多