Perl system()调用会消亡吗?

Perl system()调用会消亡吗?,perl,system,eval,die,Perl,System,Eval,Die,在Perl 5中,system()调用是否可以die? (换句话说,为了100%防止执行system()调用的程序崩溃,是否需要将其包装到eval块中,或者这完全是不必要的?) 我在中没有发现任何关于这种可能性的提及,但也没有找到确切的“这个电话永远不会消失” 注意:这里的问题是关于基本核心Perl,没有任何具有类似效果的autodie或任何其他自定义模块。另外,假设未设置任何ALRM信号,或任何其他自定义信号处理程序 我假设Perl 5.*的所有版本的行为都是相同的,但如果不是,请给出与5.

在Perl 5中,
system()
调用是否可以
die

(换句话说,为了100%防止执行
system()
调用的程序崩溃,是否需要将其包装到
eval
块中,或者这完全是不必要的?)


我在中没有发现任何关于这种可能性的提及,但也没有找到确切的“这个电话永远不会消失”

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


我假设Perl 5.*的所有版本的行为都是相同的,但如果不是,请给出与5.8相关的答案。

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

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

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

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

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

一个明确的答案需要了解内部情况,但鉴于试图调用一个不存在的程序不会消亡,我也无法想象其他任何东西会消亡:

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

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

来源:Perl 5.16.2(也选中了5.8.8),文件:pp_sys.c,第4224行,在
pp(pp_系统)
代码块:

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

根据文档,“恐慌:孩子波本厄尔诺阅读”的意思是“分叉的孩子返回了一个关于其厄尔诺的无法理解的信息”

:

按照惯例,当口译员因内伤死亡时 错误,消息开始“panic:”。历史上,许多恐慌信息 已使用简洁的固定字符串,这意味着值超出范围 这引发了恐慌,我们失去了。现在我们尝试报告这些值, 由于这种恐慌可能不可重复,原始错误消息 可能是我们试图找到原因时得到的唯一诊断


请看我对布莱恩·阿格纽的评论。这不是我要问的。“我假设您谈论的是系统功能本身的实现,而不是通过调用调用的任何东西。”-正确的“预期”-这有技术基础吗?如果你看看j.w.r.的答案,你的说法似乎完全错了。我想看看有多少CPAN模块试图捕捉
系统
引发的异常。关键不是它不可能发生,而是您通常可以使用
system()
,期望它不会引发异常。从我对源代码的阅读来看,只有当1)子级执行的exec()失败,2)子级无法发送4(可能是8)时,才会发生这种情况字节通过管道返回到父级。我还没有去查看源代码,所以我不会将此作为答案发布,但如果
系统
没有办法耗尽内存,我会感到惊讶。@Gilles-内存不足会导致Perl发出“die”而不是coredump/crash吗?我想是后者,但也不是certain@Gilles - . 让我们看看所谓的智慧发现了什么。