Perl system()调用会死吗?

时间:2012-11-05 15:10:19

标签: perl system eval die

Perl 5中的system()来电可以die吗?

(换句话说,为了100%防范执行system()调用的程序,是否需要将其封装到eval中,或完全没必要?)


我没有在perldoc system中找到这种可能性,但也没有找到确切的“这个呼叫永远不会死”。

注意:问题是关于这里的基本CORE Perl,没有autodie或任何其他具有类似效果的自定义模块。此外,假设没有设置ALRM信号,或者任何其他自定义信号处理程序。

我假设Perl 5. *的所有版本都表现相同,但如果没有,将会赞赏与5.8相关的答案。

4 个答案:

答案 0 :(得分:6)

除非我对来源的解释不正确,否则这似乎是一种可能性:

来源:Perl 5.16.2(也检查5.8.8),文件:pp_sys.c,行{42}在PP(pp_system)代码块中:

if (n != sizeof(int))
  DIE(aTHX_ "panic: kid popen errno read, n=%u", n);

DIEPerl_die(pTHX_ const* pat, ...)

中声明为util.c

根据文件,“恐慌:小孩popen errno阅读”意味着“分叉儿童返回了关于其错误的难以理解的消息”。

Explanation of panic messages in Perl

  

惯例是当口译员死于内部时   错误,消息开始“恐慌:”。从历史上看,许多恐慌信息   一直是简洁的固定字符串,这意味着超出范围的值   引发恐慌的事件已经失传。现在我们尝试报告这些值,   因此恐慌可能无法重复,并且原始错误消息   可能是我们在找到原因时得到的唯一诊断。

答案 1 :(得分:1)

您可以调用system(),期望它不会抛出异常。无需将其包装在eval块中。

答案 2 :(得分:0)

system返回程序的退出状态。这意味着,如果程序崩溃,则调用Perl脚本继续(请参阅system)。

然而,程序本身仍然可以杀死调用脚本甚至崩溃计算机。例如,在Linux中:

system 'killall', 'perl';
print "Alive\n";

答案 3 :(得分:0)

我假设您正在讨论system函数本身的实现,而不是通过调用调用的任何函数。 (显然,子进程无法在父进程的上下文中调用die,甚至假设调用是Perl代码。)

一个确定的答案需要了解内部知识,但考虑到试图调用一个不存在的程序并不会死,我无法想象其他任何事情都会出现:

system('abcd');      # 'abcd' is not recognized... [Win32 message]
say "I'm not dead."; # always prints