我需要在阻止io的腳本上超時。
令人驚訝的事實證明exit
掛起如果有一個開放的管子流程:Perl:關閉信號處理程序中的子進程管道掛起?
#!/usr/bin/perl
(-f "foo") || die "file foo doesn't exist";
open(IN, "tail -f foo |");
$SIG{ALRM} = sub
{
print "trying to exit...\n";
exit 0; # Hangs with above open() call
};
alarm 1;
while (1)
{
sleep 5; # Do stuff ...
}
由於沒有open
調用它的作品,可惜刪除它是不是在這種情況下,腳本需要它的選項。
看起來exit
試圖關閉文件句柄,這是什麼是懸掛:
$SIG{ALRM} = sub
{
print "trying to close...\n";
close(IN); # Hangs ...
print "ok\n";
exit 0;
};
我想這不是太高興從一個訊號處理器中收穫着孩子......
不任何人都知道一個很好的解決方法?
當然你是對的,傻了!令人困惑的是,一個早期的「出口」實際上是有效的,但僅僅是因爲它造成了一種競爭條件(這個孩子還沒有準備好)。謝謝 ! – lemonsqueeze