我尝试用g ++编写,我的代码如下所示:
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
using namespace std;
void h(int sNo){
cout << "Called!" << endl;
}
int main(){
signal(SIGINT,h);
pid_t id;
switch(id = fork()){
case 0:
kill(getppid(),0);
exit(0);
break;
default:
while(kill(id,0)==0){
cout << "waiting for child" << endl; sleep(1);
}
break;
}
return 0;
}
但失败了!因为父进程没有停止等待....!
答案 0 :(得分:0)
子进程已经死了,但由于你没有打电话给wait
,它就变成了一个“僵尸”。 kill
将始终返回0
,因为孩子仍然活着......作为不死生物:P
查看备注部分:http://linux.die.net/man/2/wait
摘录:
终止但尚未等待的孩子成为了 “僵尸”。内核维护有关的最小信息集 僵尸进程(PID,终止状态,资源使用信息) 为了让父母稍后进行等待获得 关于孩子的信息。只要没有移除僵尸 系统通过等待,它将消耗内核进程中的一个槽 表,如果此表填充,则无法创建 进一步的过程如果父进程终止,那么它的“僵尸” 子节点(如果有的话)由init(8)采用,它自动执行 等待移除僵尸。
更新:只是读到您不想使用wait
,但我不确定您为什么不想这样做。使用wait
是确保清理孩子使用的资源的正确方法。