【发布时间】:2014-06-22 17:18:27
【问题描述】:
Perl 的 system() 调用的返回值是否总是与 $ 完全相同?会在同一通话后立即进行吗?
是否有任何内核/外壳/系统故障模式不会出现这种情况,例如系统甚至无法启动子外壳?
(我不是询问位的编码,包括返回码(在高位)、信号和核心转储标志。)
【问题讨论】:
Perl 的 system() 调用的返回值是否总是与 $ 完全相同?会在同一通话后立即进行吗?
是否有任何内核/外壳/系统故障模式不会出现这种情况,例如系统甚至无法启动子外壳?
(我不是询问位的编码,包括返回码(在高位)、信号和核心转储标志。)
【问题讨论】:
Perl 的 system() 调用的返回值是否总是与 $ 完全相同?会在同一个电话后立即?
是的,它们都来自 Unix 系统调用wait()。
根据system:
返回值是
wait调用返回的程序退出状态。
和perlvar:
$?
这只是传统 Unixwait()系统调用返回的 16 位状态字(或者被编造出来的样子)。
注意:根据wait(2)的原型,即pid_t wait(int *stat_loc),显然system的返回值并不是wait(2)的返回值,wait(2)是一个进程id。是wait(2)通过它的第一个参数返回的子进程退出状态,因为一个C函数只能返回一个值,如果要返回多个值,需要将它们包装在一个结构体中,返回一个值该结构类型,或通过指针类型的参数。
【讨论】:
wait(2) 的手册页,这将阐明该语句的含义。
wait 返回进程ID,它还将状态存储在$?中。 wait 存储在$? 中的值与system() 返回 的值相同。