私は、perlipcのドキュメントにあるものを調べようとしています。
パイプに書き込んでいる場合は、SIGPIPE もトラップする必要があります。それ以外の場合は、存在しないコマンドへのパイプを開始したときに何が起こるかを考えてみてください: open() はおそらく成功します (fork() の成功を反映するだけです) が、出力は失敗します- -壮観に。Perl は、コマンドが実際には exec() が失敗した可能性のある別のプロセスで実行されているため、コマンドが機能したかどうかを知ることができません。したがって、偽のコマンドのリーダーはファイルの終わりをすばやく返すだけですが、偽のコマンドのライターは、処理する準備をしたほうがよいシグナルをトリガーします。検討:
open(FH, "|bogus") or die "can't fork: $!";
print FH "bang\n" or die "can't write: $!";
close FH or die "can't close: $!";
それは終わりまで爆発せず、SIGPIPE で爆発します。それをキャッチするには、これを使用できます:
$SIG{PIPE} = 'IGNORE';
open(FH, "|bogus") or die "can't fork: $!";
print FH "bang\n" or die "can't write: $!";
close FH or die "can't close: status=$?";
私がそれを正しく読んでいる場合、最初のバージョンは最終的なクローズまでおそらく死なないだろう.
しかし、それは私の OS X ボックス (Perl バージョン 5.8.9 から 5.15.9) では起こりません。open
そこに $SIG{PIPE} 行があるかどうかに関係なく、「フォークできません: そのようなファイルまたはディレクトリはありません」で爆発します。
私は何を誤解していますか?