相关疑难解决方法(0)

发送到包含子节点的perl脚本时,SIGINT(^ C)会发生什么?

我有一个分叉的Perl脚本.

每个fork运行一个外部程序,解析输出,并将输出转换为Storable文件.

然后由父母读入可存储文件,并且在继续重复前一个分支之前分析来自每个孩子的总数据,否则父母停止.

当一些孩子仍在运行外部程序时发出^ C时到底发生了什么?在前台调用父perl脚本,我认为,尽管有分叉,仍保留在前台.

是否将SIGINT传递给所有子节点,即父节点,父节点的子节点以及子节点调用的外部程序?

更新:

我应该补充一点,看来当我发出SIGINIT时,我脚本的子节点调用的外部程序似乎会确认信号并终止.但孩子们,或者父母的计划,继续下去.这一点对我来说都不清楚.

更新2:

关于tchrist的评论,外部程序是用Perl的system()命令调用的.

事实上,tchrist的评论似乎也包含了我正在寻找的解释.经过一些调试后,根据我的程序的行为,看来确实,SIGINT正从父级传递给所有子级,并且从所有子级传递给所有子级(外部程序).

因此,根据tchrist的评论,似乎正在发生的事情是CTRL-C正在杀死外部程序,导致孩子们离开system()命令 - 仅此而已.

虽然我让我的孩子检查了所调用内容的退出状态system(),但我假设CTRL-C会从父节点中删除所有内容,而不是导致创建更多轮处理,这就是发生的事情! !

解决方案(对我的问题):

我需要在父级中为SIGINT创建一个信号处理程序.然后信号处理程序将SIGTERM发送给每个子节点(我假设它也会向子节点的子节点发送SIGTERM),然后使父节点正常退出.虽然这个有点明显的解决方案可能会解决问题,但我想理解我对于在Perl中分叉的SIGINT行为的误解.

perl fork parent-child sigint

14
推荐指数
2
解决办法
5962
查看次数

标签 统计

fork ×1

parent-child ×1

perl ×1

sigint ×1