我在主程序中设置了全局信号处理程序。
只有在sleep_func
中module.pm
完成后才能捕获信号。
当我按 Ctrl + C 时,信号处理程序在sleep_func
中没有任何效果。
我希望这能像C程序一样工作。有谁知道我如何实现它?
我使用local $SIG{INT}=...
,但这不起作用。
主程序:
use strict;
$SIG{INT}=sub {print "sigint caught in main"};
require "module.pm";
sleep_func();
sleep 10;
module.pm:
use strict;
sub sleep_func {
sleep 10;
}
1;
答案 0 :(得分:3)
它不起作用的一个原因是因为你是suffering from buffering。 信号可能被捕获,信号处理程序可能正在运行,但是在程序结束之前你看不到输出,因为Perl正在缓冲输出。
一些修复
将“\ n”附加到信号处理程序的输出中 - 默认情况下,Perl的标准输出是“行缓冲”,因此Perl会在看到换行符时刷新输出缓冲区
$SIG{INT} = sub { print "sigint caught in main\n" };
在脚本中设置$|=1
- 这可以在标准输出上启用自动清除
$|=1; $SIG{INT} = sub { print "siging caught in main" };
将输出写入标准错误而不是标准错误 - 默认情况下会自动刷新标准错误
$SIG{INT} = sub { print STDERR "sigint caught in main" };
答案 1 :(得分:2)
请参阅Perl::Unsafe::Signals#DESCRIPTION。
use Perl::Unsafe::Signals;
use strict;
sub sleep_func {
UNSAFE_SIGNALS {
sleep 10;
}
}
1;
如果(不是)这会破坏,你就可以保留这些碎片。