Perl 스크립트에 INT 신호 처리기가 있습니다. Perl 스크립트가 시스템 호출 중에 INT가 전송되면 실행되지 않습니다. 왜?시스템 서브 루틴 및 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
펄 버전은 다음과 같습니다
$ 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} = "무시"; sleep 5'}); 1 while! waitpid (-1, 0) && $! {EINTR}; ' – ikegami
Andy가 언급했듯이, 핸들러가 호출되지 않는 이유는'system'이 그것의 실행 중에'SIGINT'와'SIGQUIT'를'IGNORE'로 설정한다는 것입니다. – ikegami