繁体   English   中英

忽略一个信号并告诉它在Perl中什么也不做的区别是什么?

[英]What's the difference between ignoring a signal and telling it to do nothing in Perl?

如果我告诉Perl明确忽略一个信号,SIGINT没有效果:

$SIG{INT} = 'IGNORE';
my $count = 0;
say $count++ and sleep 1 while 1;

然后按Control-C显然没有效果。 另一方面,如果我告诉它什么都不做:

$SIG{INT} = sub { };
my $count = 0;
say $count++ and sleep 1 while 1;

然后按Control-C有效! 它从sleep()调用中唤醒程序并立即递增计数。 忽略信号并告诉它什么都不做之间的区别是什么?

在我的程序中,我想让代码在SIGINT上运行, 而不会破坏任何东西。 我想要的东西:

$SIG{INT} = sub { say "Caught SIGINT!"; return IGNORED; };  # runs without disrupting sleep

忽略信号并告诉它什么都不做之间的区别是什么?

在传递信号时仍会调用“无所事事”处理程序,在这种情况下会中断sleep调用。 另一方面,忽略的信号被系统简单地丢弃,对过程没有任何影响。

请参阅此处了解特定于C的更全面的参考。

信号传递可以中断大量系统调用。 通常你可以检查$! (又名errno )看看它是否是EINTR并采取行动重新尝试失败的系统调用。

如果您的代码的某些部分(在这种情况下,您的sleep()调用)不会中断,那么您可以使用POSIX::sigprocmask在您处于关键部分时阻止信号。 应用程序收到的任何信号都将排队,直到您取消阻止它们为止,此时它们将被传递。 我很确定当特定类型的多个信号被阻塞时会有一些有趣的语义(我认为它们可能合并成一个信号)。

这是IBM关于重入函数的一个很好的入门读物 ,包含一些带有sigprocmask示例。

不知道为什么它没有像你期望的那样工作,但通常当我尝试完成类似的事情时,除了INT信号之外我还会捕获TERM信号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM