获取已经运行进程的子进程ID

时间:2013-08-06 09:57:43

标签: c node.js process

我正在调用一个外部程序(通过节点中的pty.js),当它运行时会生成一个子进程。当父进程完成时,它会使子进程退出一段时间(孤立)。我可以获取父进程的id,但是想获取生成的子进程的id,这样我就可以在父进程退出时终止它。

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

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

修改

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

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

2 个答案:

答案 0 :(得分:1)

在node.js中,您可以通过child_process库完成此操作。有一个pid成员函数可以返回生成的子元素的pid。 E.g。

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来生成/分叉新进程。

答案 1 :(得分:1)

如果您可以在父进程结束时添加此代码:

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

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

以下是问题:

如果父进程已完成但子进程没有完成,则这些子进程称为:“孤立进程 zombie ” 。 “僵尸进程”是指在专利流程仍在运行时完成的子进程,父进程无法处理子进程的后果。

由于系统将“init”设置为所有“孤儿进程”的父级。init进程将处理所有内容。所以你什么都不需要。!!