我有一个perl脚本,其中包含使用fork生成的多个子进程。父处理SIGINT和子进程忽略SIGINT($ SIG {INT} ='IGNORE')。
$SIG{'INT'} = sub {
print "Caught Ctrl+C by $$\n";
# while($result != -1){
# $result = wait();
#}
die "Stopping...";
};
a)如果包含注释行,脚本将等待孩子完成然后退出。
b)但是,如果我评论“等待”行,我认为它的工作原理是这样的 - 脚本退出,父进程终止 - 孩子们继续在后台跑步并在退出前按预期显示一些消息。
我理解a)案例,但b)案例如何运作,请解释为什么这不会产生僵尸进程?
此问题扩展/与Wait for children to complete if parent intercepts SIGINT
相关答案 0 :(得分:2)
这与perl无关。
当一个进程退出时,进程的所有子进程都被“重新授予”init - 它们的ppid被重置为1,这是在机器启动时启动的init进程的pid。
初始化进程在启动机器之后,进入循环等待(和收割)子进程。所以任何重新归属于init的孩子都不会留下僵尸 - init会立即清理它。