【发布时间】:2009-07-29 03:22:08
【问题描述】:
如果我告诉 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
【问题讨论】:
-
您的信号处理程序如何在不中断当前运行的情况下运行?信号处理逻辑必须知道在信号发生之前应该发生什么。