Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perlipc文档中的错误?_Perl_Ipc - Fatal编程技术网

perlipc文档中的错误?

perlipc文档中的错误?,perl,ipc,Perl,Ipc,我正试图把我在文档中看到的东西弄清楚 如果您正在向管道写入数据,还应该捕获SIGPIPE。否则,, 想象一下当您启动一个管道到一个命令时会发生什么 不存在:open()很可能会成功(只有 反映fork()的成功),但您的输出将 失败——惊人地失败。Perl无法知道该命令是否有效 因为您的命令实际上是在一个单独的进程中运行的 exec()可能失败了。因此,当读者使用虚假命令时 只需返回文件的快速结尾,写入程序就会触发伪命令 一个他们最好准备好处理的信号。考虑: 在收盘前不会爆炸,它会随着一声巨响爆

我正试图把我在文档中看到的东西弄清楚

如果您正在向管道写入数据,还应该捕获SIGPIPE。否则,, 想象一下当您启动一个管道到一个命令时会发生什么 不存在:open()很可能会成功(只有 反映fork()的成功),但您的输出将 失败——惊人地失败。Perl无法知道该命令是否有效 因为您的命令实际上是在一个单独的进程中运行的 exec()可能失败了。因此,当读者使用虚假命令时 只需返回文件的快速结尾,写入程序就会触发伪命令 一个他们最好准备好处理的信号。考虑:

在收盘前不会爆炸,它会随着一声巨响爆炸 西格皮普。要捕获它,您可以使用以下方法:

如果我没看错的话,它说第一个版本可能要到最后一个版本才会消亡

但是,在我的OSX设备上(Perl版本5.8.9到5.15.9)并没有发生这种情况。无论我是否有$SIG{PIPE}行,它在
open
上都会弹出一个“不能分叉:没有这样的文件或目录”


我误解了什么?

我的Perl上的相同输出,
v5.14.2
,Ubuntu 12.04:

$perl
打开(FH,“|伪造”)或死亡“不能分叉:$!”;
打印FH“砰\n”或“无法写入:$!”;
关闭FH或死亡“无法关闭:$!”;
无法分叉:第1行没有这样的文件或目录。

这个错误很奇怪,因为它与分叉无关——他们一定添加了一些前瞻性猜测,看看它是否可以执行
。(这充其量只是一种争用条件,但在常见情况下,它可能提供更好的错误处理;并且只会在争用失败时与旧行为一样不方便。)

这是在5.6的开发过程中实现的更改,以便system()能够检测出它何时无法分叉/执行子级

它也记录在


它本身指向perlipc,但perlipc似乎确实缺少这一点

我认为
open
已更改为更好地报告该案例,并且
perlipc
未更新;您仍然可以获得文档化的行为,但是您需要使用更详细的
open(…,“|-”)
mechanism.geekosaur:切换到
openmy$fh,“|-”,“伪造”“或模具
给出相同的错误。Erm。我指的是一段很长的路,你根本不指定命令,而是脚本本身
fork
s,然后在子脚本中运行
exec
;假设Perl已经尝试使用内部
路径
搜索,并且
exec
如果没有涉及shell元字符,那么它已经预先检测到“未找到”。@geekosaur:但是
可能在
路径
中,并且在
execve()
调用最终到来时是可执行的。是的,只需要几毫秒,但是。:)我认为,只有当你在编写代码时特别期望它会失败时,这才算作竞争条件。是的,这取决于
chmod a-x/bin/bogus
在程序执行期间的时间,以获得不同的行为。绊倒会很棘手。
   open(FH, "|bogus")  or die "can't fork: $!";
   print FH "bang\n"   or die "can't write: $!";
   close FH            or die "can't close: $!";
   $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=$?";