perl 中的信号处理
Signal handling in perl
use strict;
use warnings;
print "hello\n";
sleep(10);
print "print before alarm\n";
alarm 5;
$SIG{'ALRM'} = \&alarm;
$SIG{'INT'} = \&alarm;
$SIG{'TERM'} = \&alarm;
sub alarm {
print "alarm signal hanndled\n";
}
我无法处理警报或按 ctrl+c 的信号。我搜索并发现这是一种进行信号处理的方法。我做错了什么?
首先,设置处理程序。然后,设置闹钟。最后,做耗时操作(sleep)。你把它倒过来了:
#! /usr/bin/perl
use strict;
use warnings;
$SIG{'ALRM'} = \&alarm;
$SIG{'INT'} = \&alarm;
$SIG{'TERM'} = \&alarm;
print "hello\n";
alarm 5;
sleep(10);
print "after sleep\n";
sub alarm {
print "alarm signal handled\n";
}
与其为每个 SIG 复制处理程序,不如使用 sigtrap。
这个例子阻止了用户杀人,但是你可以在处理程序中做任何你想做的事情。当然,如果您的处理程序执行 'exit',您还可以使用 END 子程序来执行其他操作。
use strict;
use warnings;
use sigtrap 'handler' => \&sig_handler, qw(INT TERM KILL QUIT);
sub sig_handler {
my $sig_name = shift;
print "You can't kill me! $sig_name caught";
}
for (1 .. 10) {
print $_ . "\n";
sleep 1;
}
或者您可以使用现有的信号列表...
use sigtrap 'handler' => \&sig_handler, qw(any normal-signals error-signals stack-trace);
有关详细信息,请参阅 perldoc sigtrap
use strict;
use warnings;
print "hello\n";
sleep(10);
print "print before alarm\n";
alarm 5;
$SIG{'ALRM'} = \&alarm;
$SIG{'INT'} = \&alarm;
$SIG{'TERM'} = \&alarm;
sub alarm {
print "alarm signal hanndled\n";
}
我无法处理警报或按 ctrl+c 的信号。我搜索并发现这是一种进行信号处理的方法。我做错了什么?
首先,设置处理程序。然后,设置闹钟。最后,做耗时操作(sleep)。你把它倒过来了:
#! /usr/bin/perl
use strict;
use warnings;
$SIG{'ALRM'} = \&alarm;
$SIG{'INT'} = \&alarm;
$SIG{'TERM'} = \&alarm;
print "hello\n";
alarm 5;
sleep(10);
print "after sleep\n";
sub alarm {
print "alarm signal handled\n";
}
与其为每个 SIG 复制处理程序,不如使用 sigtrap。
这个例子阻止了用户杀人,但是你可以在处理程序中做任何你想做的事情。当然,如果您的处理程序执行 'exit',您还可以使用 END 子程序来执行其他操作。
use strict;
use warnings;
use sigtrap 'handler' => \&sig_handler, qw(INT TERM KILL QUIT);
sub sig_handler {
my $sig_name = shift;
print "You can't kill me! $sig_name caught";
}
for (1 .. 10) {
print $_ . "\n";
sleep 1;
}
或者您可以使用现有的信号列表...
use sigtrap 'handler' => \&sig_handler, qw(any normal-signals error-signals stack-trace);
有关详细信息,请参阅 perldoc sigtrap