8

在 Perl 5 中可以system()调用吗?die

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


我在 中没有找到任何提及这种可能性的内容perldoc system,但也没有完全找到确切的“这个电话永远不会消亡”。

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

我假设 Perl 5.* 的所有版本都表现相同,但如果不是,将不胜感激与 5.8 有关的答案。

4

4 回答 4

6

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

来源:Perl 5.16.2(也检查了 5.8.8),文件:pp_sys.c,行:PP(pp_system)代码块内的 4224:

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

DIEPerl_die(pTHX_ const* pat, ...)声明在util.c

根据文档,“panic:kid popen errno read”是指“forked child 返回了一个关于其 errno 的难以理解的消息”。

panicPerl中的消息解释

约定是当解释器因内部错误而死时,消息以“panic:”开头。从历史上看,许多恐慌消息都是简洁的固定字符串,这意味着触发恐慌的超出范围的值会丢失。现在我们尝试报告这些值,因为此类恐慌可能无法重复,并且原始错误消息可能是我们尝试查找原因时得到的唯一诊断。

于 2012-11-05T17:12:29.943 回答
2

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

于 2012-11-05T15:50:08.447 回答
1

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

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

system 'killall', 'perl';
print "Alive\n";
于 2012-11-05T15:42:44.483 回答
0

我假设您正在谈论system函数本身的实现,而不是通过调用调用的任何内容。(显然,子进程不能die在父进程的上下文中调用,即使这样也假定调用是对 Perl 代码的。)

一个明确的答案需要了解内部知识,但鉴于尝试调用不存在的程序不会死,我无法想象还有其他任何事情会发生:

system('abcd');      # 'abcd' is not recognized... [Win32 message]
say "I'm not dead."; # always prints
于 2012-11-05T16:05:36.043 回答