【发布时间】:2012-06-27 20:07:32
【问题描述】:
我有以下 perl 代码尝试将字符串写入新创建的文件:
open(OUT, ">$file") or die "file out error!\n";
print OUT $string;
通常,此代码可以正常工作。如果我们对 $file 所在的目录没有写权限,程序就会失败,这是意料之中的。但是,不是打印“文件输出错误!”作为错误消息,程序只是以退出代码 13(权限被拒绝)退出。
- 当我们无法写入文件时,为什么打开方法会成功?
- 在这种情况下,我们如何获得适当的错误消息?
【问题讨论】:
-
首先,我认为
open永远不会导致 SIGPIPE。写入封闭管道时会得到一个 SIGPIPE。这意味着print可能是 SIGPIPE 的原因。$SIG{PIPE} = 'IGNORE';将导致系统(因此print)返回 $!=EPIPE 而不是抛出 SIGPIPE。 -
是的,我同意所有观点,尽管它没有回答我的问题。
-
EROFS表示您要写入的整个文件系统是只读的,而不是您尝试写入读写文件系统上的只读文件。有关该错误,请参阅EACCES。 -
你的程序的退出代码是什么?如果是 13,那么这表明
EACCES调用中的open错误。如果是 141,那就是SIGPIPE的证据。 -
当系统返回该错误时,Perl 的 open 确实返回 false 和 $!=EACCES。 (
chmod a-w . ; perl -e'open my $fh, ">", "file" or die $!')