Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
Perl写入文件流导致意外的SIGPIPE错误_Perl_File Io_Sigpipe - Fatal编程技术网

Perl写入文件流导致意外的SIGPIPE错误

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方法会成功 我们如何在此实例中获得适当的错误消息 我认为您混淆了程序退出代码和标准系统

我有以下perl代码,它试图将字符串写入新创建的文件:

open(OUT, ">$file") or die "file out error!\n";
print OUT $string;
通常,此代码工作正常。如果我们没有对$file所在目录的写入权限,则程序将失败,这是预期的。但是,程序没有打印“文件输出错误!”作为错误消息,而是以退出代码13(权限被拒绝)退出

  • 当我们无法写入文件时,为什么open方法会成功
  • 我们如何在此实例中获得适当的错误消息

  • 我认为您混淆了程序退出代码和标准系统错误代码的报告。错误代码(
    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