为什么SIGINT在这里被抓到?

这里发生了什么? 我认为SIGINT将被发送到前台进程组。

(我想,也许,system()正在运行一个为子进程创建一个新进程组的shell?任何人都可以证实这一点?)

% perl
local $SIG{INT} = sub { print "caught signaln"; };
system('sleep', '10');

然后按ctrl + d然后按ctrl + c立即注意到“抓到的信号”从不打印。

我觉得这是一件简单的事情......无论如何要解决这个问题? 问题是,当通过系统结果持有ctrl + c运行一堆命令,直到所有迭代完成(因为perl永远不会获取SIGINT)并且相当烦人...

这怎么解决? (我已经直接使用fork()进行了测试,并且明白这是有效的......这不是一个可接受的解决方案)

更新 :请注意,这与“睡眠” 无关 ,只是命令需要一些任意长的时间来运行,这比围绕它的perl要多得多。 那么按下ctrl + c会被发送到命令(就像在前台进程组中那样),并以某种方式设法永远不会发送给perl。


来自perldoc系统:

由于SIGINT和SIGQUIT在系统执行期间被忽略,如果您希望程序在接收到这些信号时终止,您将需要根据返回值自行安排。

@args = ("command", "arg1", "arg2");
system(@args) == 0
   or die "system @args failed: $?"

如果您想手动检查系统的故障,可以通过检查$来检查所有可能的故障模式。 喜欢这个:

if ($? == -1) {
    print "failed to execute: $!n";
}
elsif ($? & 127) {
    printf "child died with signal %d, %s coredumpn",
       ($? & 127),  ($? & 128) ? 'with' : 'without';
}
else {
    printf "child exited with value %dn", $? >> 8;
}

或者,您可以使用来自POSIX模块的W *()调用来检查$ {^ CHILD_ERROR_NATIVE}的值


我并不完全明白你想在这里实现的目标......但是你是否试图简单地比较一下:

perl -wle'local $SIG{INT} = sub { print "caught signal"; }; sleep 10;'

你能解释一下你试图去做什么,以及为什么你要调用shell? 你能直接调用外部程序而不涉及shell吗?

链接地址: http://www.djcxy.com/p/46903.html

上一篇: Why doesnt SIGINT get caught here?

下一篇: How can I run Django project