我试图通过我在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} 行,它都会以“无法分叉:没有这样的文件或目录”而爆炸。
我有什么误解?