Perl升级后的奇怪错误:无法刷新stdout

时间:2018-05-24 11:10:13

标签: perl runtime-error warnings

升级到Perl 5.24.4后,我们在日志中反复出现此错误(不指向文件名和行号):

  

无法清除标准输出:管道损坏

我们不知道导致此错误的原因。

有没有建议如何理解错误的原因?

3 个答案:

答案 0 :(得分:5)

错误来自perl.c, line 595

        PerlIO_printf(PerlIO_stderr(), "Unable to flush stdout: %s",
                      Strerror(errno));

此行是perl_destruct的一部分,在程序结束时调用该行以关闭perl解释器。

作为全局关闭过程的一部分,将清除所有仍打开的文件句柄(即,写出所有缓冲的输出)。上面的评论说:

 /* Need to flush since END blocks can produce output */
 /* flush stdout separately, since we can identify it */

该错误消息未在perldoc perldiag中列出,这可以说是一个文档错误。它可能被忽略了,因为它不是真正的warndie调用,实际上只是print STDERR $message。它与文件名或行号无关,因为它仅在程序停止运行后(即在调用exit之后或由于执行不在主脚本末尾而发生)发生。

答案 1 :(得分:2)

这是非常一般的建议,但是

use Carp::Always;

位于脚本顶部,或以

运行
perl -MCarp::Always the_script.pl arg1 arg2 ...

将使Perl生成包含每个警告和错误的堆栈跟踪。

答案 2 :(得分:2)

<script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script> <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.css" /> <div class="ui-widget"> <label for="tags">Tags: </label> <input id="tags"> </div>是与系统错误Broken pipe相关的错误字符串。写入关闭的管道时,会收到此错误。通常,写入封闭的管道会导致SIGPIPE终止该进程,因此这意味着SIGPIPE的行为已从其默认值更改。

EPIPE

作为melpomene discovered,如果您在$ perl -e' $SIG{PIPE} = "IGNORE"; print "foo\n" or die("Can\x27t write to STDOUT: $!\n"); sleep(2); close(STDOUT) or die("Unable to flush STDOUT: $!\n"); ' | perl -e'sleep(1)' Unable to flush STDOUT: Broken pipe 块中写入断开的管道,则会自动输出错误。

END

这不一定是问题,尽管它可能表明进程过早退出。