Perl 5中的system()
来电可以die
吗?
(换句话说,为了100%防范执行system()
调用的程序,是否需要将其封装到eval
块中,或完全没必要?)
我没有在perldoc system
中找到这种可能性,但也没有找到确切的“这个呼叫永远不会死”。
注意:问题是关于这里的基本CORE Perl,没有autodie
或任何其他具有类似效果的自定义模块。此外,假设没有设置ALRM
信号,或者任何其他自定义信号处理程序。
我假设Perl 5. *的所有版本都表现相同,但如果没有,将会赞赏与5.8相关的答案。
答案 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);
DIE
在Perl_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