我在我的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 ...
但是,如果我更換一個睡眠調用系統調用,它按預期工作:
$ 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
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
...
如果這是真的,下面將不會響應^ C警告:'使用IPC :: Open3; $ SIG {INT} = sub {warn(「INT」)}; open3('<&STDIN', '>&STDOUT','>&STDERR', q {perl -e'$ SIG {INT} =「IGNORE」; sleep 5'}); waitpid(-1,0)&& $!{EINTR}; ' – ikegami 2011-04-27 17:53:35
正如Andy所說,處理程序未被調用的原因在於'system'在其運行時將'SIGINT'和'SIGQUIT'設置爲'IGNORE'。 – ikegami 2011-04-27 17:54:43