2

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

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

或者,我想我可以调用 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;
    }
  }
}
4

2 回答 2

1

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

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

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

这是问题所在:

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

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

于 2013-08-06T11:13:42.447 回答
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生成/分叉新进程。

于 2013-08-06T10:45:33.853 回答