我正在调用一个外部程序(通过节点中的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;
}
}
}
答案 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
进程将处理所有内容。所以你什么都不需要。!!