Perl写入文件流导致意外的SIGPIPE错误
我有以下perl代码,它试图将字符串写入新创建的文件:Perl写入文件流导致意外的SIGPIPE错误,perl,file-io,sigpipe,Perl,File Io,Sigpipe,我有以下perl代码,它试图将字符串写入新创建的文件: open(OUT, ">$file") or die "file out error!\n"; print OUT $string; 通常,此代码工作正常。如果我们没有对$file所在目录的写入权限,则程序将失败,这是预期的。但是,程序没有打印“文件输出错误!”作为错误消息,而是以退出代码13(权限被拒绝)退出 当我们无法写入文件时,为什么open方法会成功 我们如何在此实例中获得适当的错误消息 我认为您混淆了程序退出代码和标准系统
open(OUT, ">$file") or die "file out error!\n";
print OUT $string;
通常,此代码工作正常。如果我们没有对$file所在目录的写入权限,则程序将失败,这是预期的。但是,程序没有打印“文件输出错误!”作为错误消息,而是以退出代码13(权限被拒绝)退出
我认为您混淆了程序退出代码和标准系统错误代码的报告。错误代码(
errno
)13等同于“权限被拒绝”
当然,根据您的操作系统,实际消息可能略有不同
就这一点而言,更好的(IMO)方法是:像‘openout’、“>”、“$file”或“die”不能打开$file:$!\n 首先,我不认为
open
会导致SIGPIPE。向封闭管道写入时,会得到一个SIGPIPE。这意味着print
可能是SIGPIPE的原因<代码>$SIG{PIPE}='IGNORE'将导致系统(从而打印
)返回$=EPIPE而不是SIGPIPE。是的,我同意所有的观点,尽管它没有回答我的问题。EROFS
表示您要写入的整个文件系统是只读的,而不是您试图写入读写文件系统上的只读文件。请参阅EACCES
了解该错误。您的程序的退出代码是什么?如果是13,则表示在open
调用中出现EACCES
错误。如果是141,这就是SIGPIPE的证据。Perl的open确实返回false和$=当系统返回该错误时,每次都会发生。(chmod a-w.;perl-e'openmy$fh,“>”,“file”或die$!”
)退出的进程设置$?
(WEXITSTATUS),而不是$代码>(错误号)<代码>$?=13
在许多系统上都是SIGPPIPE。使用die
退出程序时,系统错误代码和程序退出代码可能相同。试试perl-e'$=4."死",;echo$?
和perl-e'$=14;"死",;例如,echo$?
。@mob,bash的$?
与Perl的不同。这只是退出密码的一部分。该示例中的退出代码是4,就这一点而言,更好的(IMO)方法为open构造错误消息是:`open OUT,“>”、“$file”或die“cannotopen$file:$!\n”。@ikegami啊,那么您的原始注释就更有意义了。当然可以:“退出代码”$?>>8,进程接收的信号号是$?&127。
perl -lE '$!=13;say $!'
Permission denied
perl -lE '$!=32;say $!'
Broken pipe