这是怎么回事?我认为SIGINT将被发送到前台进程组。为什么SIGINT在这里被抓到?
(我想,也许,该系统()正在运行一个外壳,其子进程创建一个新的进程组?任何人都可以证实这一点?)
% perl
local $SIG{INT} = sub { print "caught signal\n"; };
system('sleep', '10');
然后按ctrl + d,然后按Ctrl + c,并注意“捕获的信号”从不打印。
我觉得这是一件简单的事情......无论如何要解决这个问题?问题是,当通过系统结果持有ctrl + c运行一堆命令,直到所有迭代完成(因为perl永远不会获得SIGINT)并且相当烦人时,通过系统结果运行一堆命令...
这怎么能解决? (我已经测试了使用fork()的直接和明白,这个工程......这是不是一个可以接受的解决方案,在这个时候)
UPDATE:请注意,这有什么做“沉睡”只有命令需要一些任意长的时间才能运行,这比perl周围的命令要多得多。那么按下ctrl + c会被发送到命令(就像在前台进程组中那样),并以某种方式设法永远不会发送给perl。
methinks我需要再次阅读文档: - /谢谢。 – dlamotte 2010-07-14 16:36:40
我想补充一点,你需要检查孩子的返回值的原因是你的shell将^ c/INT传递给整个进程组,给perl和儿童,在这种情况下,终止你的孩子的“睡眠10”。如果你简单地'从另一个shell中'kill -INT $ perl_pid',perl将很高兴SIG_IGNore你。 – pilcrow 2010-07-14 16:49:14