Perl 的 system() 命令的退出代码为 13?

Perl 的 system() 命令的退出代码为 13?

我正在尝试使用 从 perl 调用系统命令system()

通常情况下,这种方法可以正常工作,但是当我自己不启动 perl 脚本,而是让编译后的 C 程序使用 Cpopen()函数运行它时,perl 就无法执行其系统命令。system()然后 Perl 会返回退出代码 13。

仅当我在 Perl 中使用反引号而不是时,它才有效system。有人知道为什么吗?

答案1

查看您的一些代码/输出会有所帮助。以下是我对您的问题根本原因的猜测。

首先,信号 13 等同于 SIGPIPE,在这种情况下似乎表明 perl 进程正在尝试写入管道(即 STDOUT/STDERR),但没有任何内容可以读取它。

我进行了一些测试,我的问题是,您是否在 C 程序中处理脚本的输出?在我的测试中,只需处理 perl 脚本的输出即可避免 SIGPIPE 错误。

信号 13 产生:

fp = popen("/home/chuckx/perl-test/perl.pl","r");
status = pclose(fp);

避免信号 13:

fp = popen("/home/chuckx/perl-test/perl.pl","r");

do {} while (fgets(output,80,fp) != NULL);

status = pclose(fp);

答案2

我将这个答案添加到一个旧问题中,因为我遇到了类似的问题popen。如果我用(在 C/C++ 程序中)运行命令popen并且在调用“pclose”之前不读取任何程序输出,它将返回值 13。我认为这里发生的事情是正在运行的命令无法将其所有输出写入管道(因为我从未读取任何内容),因此当它关闭时,它将返回值 13。

如果其他人也遇到这种情况,请尝试在popen关闭之前读取管道/文件返回的全部内容。

相关内容