为什么孩子不会成为perl的僵尸

时间:2015-11-15 19:19:51

标签: perl fork

我有一个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

相关

1 个答案:

答案 0 :(得分:2)

这与perl无关。

当一个进程退出时,进程的所有子进程都被“重新授予”init - 它们的ppid被重置为1,这是在机器启动时启动的init进程的pid。

初始化进程在启动机器之后,进入循环等待(和收割)子进程。所以任何重新归属于init的孩子都不会留下僵尸 - init会立即清理它。