我有一个分叉的 Perl 脚本。
每个 fork 运行一个外部程序,解析输出,并将输出转换为 Storable 文件。
然后父级读取可存储文件,并分析来自每个子级的总数据,然后再继续重复前一个分叉,否则父级停止。
当我发出 ^C 而一些孩子仍在运行外部程序时,究竟会发生什么?父 perl 脚本在前台被调用,我想,尽管有分叉,它仍然在前台。
SIGINT是否传递给所有的孩子,即父母,父母的孩子,以及孩子们调用的外部程序?
更新:
我应该补充一点,当我发出 SIGINIT 时,我的脚本子级调用的外部程序似乎确认了信号并终止。但是孩子们,或者也许是家长计划,继续进行。这一切我都不清楚。
更新 2:
关于 tchrist 的注释,外部程序是用 Perl 的system()
命令调用的。
事实上,tchrist 的评论似乎也包含我正在寻找的解释。经过更多调试后,根据我的程序的行为,似乎确实 SIGINT 正在从父级传递给所有子级,并从所有子级传递给所有子级(外部程序)。
因此,根据 tchrist 的评论,似乎正在发生的事情是 CTRL-C 正在杀死导致孩子们离开system()
命令的外部程序 - 仅此而已。
虽然我让我的孩子检查了调用的退出状态system()
,但我假设 CTRL-C 会杀死父级以下的所有内容,而不是导致创建更多轮处理,这就是正在发生的事情! !
解决方案(我的问题):
我只需要在父级中为 SIGINT 创建一个信号处理程序。然后,信号处理程序会将 SIGTERM 发送给每个孩子(我想这也会向孩子的孩子发送 SIGTERM),然后让父母优雅地退出。尽管这个有点明显的解决方案可能会解决问题,但我想了解我对 SIGINT 与 Perl 中的分叉相关的行为的误解。