使用 system() 执行命令返回返回值的 256 倍 ( << 8).这有什么意义



我花了一段时间才找到与此相关的问题的解决方案:

status = system("[ -e myFile ] && exit 1 || exit 101");
if(status == 101)
{
    ...

返回值作为 25856(101*256(或 101 <<8((发送回。

我找到的答案都没有表明这种有效的 256 乘法发生的原因......

有人能为我提供解释吗?

谢谢!

就语言标准而言,system()的返回值是实现定义的。 没有理由假设 system() 的返回值与运行的命令的退出状态有任何关系。

但是,对于符合 POSIX 标准的库,成功调用 system() 的返回值定义为采用 wait (2( 函数使用的格式。 我推测这是为了一致性,也许也是为了易于实施。 在任何情况下,该返回值不仅包含有关退出状态的信息,还包含有关进程如何终止的信息(通常或由于信号(和其他信息。 在这样的系统上,人们期望通过将WIFEXITED()宏应用于代码来检查进程是否正常退出,并通过WEXITSTATUS()宏提取退出状态本身。 这些宏将在 sys/wait.h 中声明。

当然,这一切都非常C-ish。 除了其中一些之外,可能还有更C++式的替代方案。

对于任何系统调用的返回值,高 8 位是退出状态,低 8 位是信号 ID。要检索退出状态,就像您发现的那样,您必须将值向右移动 8 位。

system的返回值是实现定义的。特别是,它没有定义为返回执行的命令传递给exit的值。

为什么你的系统碰巧不仅返回命令的返回值,还返回一个恰好是0的低阶字节......这也取决于你正在使用的实现。

如果您碰巧正在使用 POSIX,您可以阅读本手册以了解system返回的内容:

如果命令不是空指针,system(( 应以 waitpid(( 指定的格式返回命令语言解释器的终止状态

waitpid手册会告诉您可以从返回值中解释哪些信息以及如何解释。

最新更新