我花了一段时间才找到与此相关的问题的解决方案:
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
手册会告诉您可以从返回值中解释哪些信息以及如何解释。