2
我的管道(文件句柄,套接字)中斷(有時)。我可以用下面的代碼重現:Perl:如何防止SIGALRM關閉管道?
my $counter = 5;
alarm(1);
open(FH,"while(sleep 2); do date; done |") or die $!;
while (<FH>) { print; }
close(FH);
BEGIN {
$SIG{ALRM} = sub {
print "alarm!\n";
exit if --$counter == 0;
alarm(1);
};
}
將產生:
alarm!
alarm!
Thu Feb 7 11:46:29 EST 2013
alarm!
alarm!
alarm!
如果我與strace這個過程中,我看到催生外殼得到一個SIGPIPE。但是,Perl進程繼續愉快。我該如何解決?
什麼問題?在您的ALRM處理程序中,您調用exit,以便perl退出並關閉文件描述符。當子shell寫入關閉的文件句柄時,它會得到一個SIGPIPE。您是否希望subshell忽略SIGPIPE,並且只會一直持續下去,寫入失敗? –
你調用'exit'後,你的Perl進程會繼續快樂嗎? – mob