我的Perl脚本中有一个INT信号处理程序.当Perl脚本处于系统调用中时发送INT时不会执行它.为什么?
考虑:
$ perl5.12/bin/perl -E "$(cat <<EOF
\$SIG{INT} = sub {say q(trapped INT); exit};
say q(sleeping ...);
system q(sleep 10000); # INT at this point is not caught by Perl.
EOF)"
sleeping ...
Run Code Online (Sandbox Code Playgroud)
但是,如果我用睡眠呼叫替换系统调用,它按预期工作:
$ perl5.12/bin/perl -E "$(cat <<EOF
\$SIG{INT} = sub {say q(trapped INT); exit};
say q(sleeping ...);
sleep 10000; # replaces the system call from above
EOF)"
sleeping ...
trapped INT
Run Code Online (Sandbox Code Playgroud)
Perl版本是:
$ perl5.12/bin/perl -v
This is perl 5, version 12, subversion 3 (v5.12.3) built for x86_64-linux-thread-multi
(with 9 registered patches, see perl -V for more detail)
Copyright 1987-2010, Larry Wall
Binary build 1204 [294330] provided by ActiveState http://www.ActiveState.com
Built Feb 9 2011 14:48:47
...
Run Code Online (Sandbox Code Playgroud)
您可以通过检查来检测system()子进程是否被杀死,如下所示:SIGINT$?
use POSIX qw(SIGINT);
sub interrupt {
say "trapped INT";
exit;
}
$SIG{INT} = \&interrupt;
say "sleeping";
system ("sleep 100");
if (($? & 127) == SIGINT) {
interrupt();
} elsif ($?) {
say "subprocess failed, status $?";
}
Run Code Online (Sandbox Code Playgroud)
该INT和QUIT信号被忽略的perl而外部命令运行,见system().
| 归档时间: |
|
| 查看次数: |
1745 次 |
| 最近记录: |