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