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

时间:2016-02-10 15:00:22

标签: c++ return-value bit-shift

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

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

if(status == 101)
{
    ...

返回值被发送回25856(101 * 256(或101 <&lt; 8))。

我发现的答案都没有表明这个有效的256次乘法发生的原因......

任何人都可以为我提供解释吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

当然,这一切都非常C-ish。可能有更多的C ++ - 替代其中一些。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

为什么特别是你的系统碰巧不会只返回命令的返回值,而是一个恰好是0的低位字节...那也取决于你的实现正在使用。

如果您恰好使用POSIX,可以阅读此manual以找出system返回的内容:

  

如果command不是空指针,system()将以waitpid()

指定的格式返回命令语言解释器的终止状态。

waitpid的{​​{3}}告诉您可以从返回值中解释哪些信息以及如何解释。