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