WEXITSTATUS(status)返回什么?

43

我正在尝试理解 WEXITSTATUS(status) 的工作原理。我遇到了一段代码,其中WEXITSTATUS(status)的返回值被添加到一个变量中。

以下是代码片段:

waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);

如何计算WEXITSTATUS的返回值?


6
如果所有命令都成功执行,那么 counter 中的值将为零;如果任何一个命令以失败(非零)状态退出,则 counter 中的值将为非零。如果运行的命令太多而遇到溢出问题,则可能会巧合地获得0,即使几乎所有命令都失败了,但这种情况的概率非常小。请注意,如果命令因信号(WIFSIGNALED)而死亡,则 WEXITSTATUS 将为零,但该命令仍然失败。 - Jonathan Leffler
好的,我理解了那部分内容。我真的想知道基于它接收到的信号,状态值会被设置为什么。WIFSIGNALED、WIFSTOPPED等是否将状态设置为整数值?我们如何知道这个值是多少? - shaveenk
2
评估status,其中包含进程的退出代码。如果进程12345调用exit(7)并且您使用waitpid(12345, &status, 0),那么WEXISTATUS(status)将产生7 - Matthew Read
1个回答

41

WEXITSTATUS(stat_val) 是一个宏(因此实际上它并不“返回”任何东西,而是“评估”为某个值)。

如果想要了解它的工作原理,您可能需要查看您所使用的 C 编译器的头文件(应该通过 <sys/wait.h> 引入)。

这个宏的实现可能因 C 实现而异。

请注意,只有当宏 WIFEXITED(stat_val) 给出非零值时,此宏才提供合理的值。

来自 waitpid() 的 POSIX 规范

WEXITSTATUS(stat_val)

如果 WIFEXITED(stat_val) 的值非零,那么此宏将计算子进程传递给 _exit()exit() 的状态参数的低 8 位,或子进程从 main() 返回的值。


将特定程序的返回代码相加的动机仅为代码作者和希望存在的文档所知。


1
我曾经参考过man waitpid。但是我无法运行这段代码。我该如何获取状态参数的低8位的值?我该如何获取status所取的整数值? - shaveenk
3
你是指代码无法运行还是无法编译?你遇到了哪些错误? - alk
我的猜测是,他们期望返回代码为0或1,其中0表示成功,1用于增加错误计数器。如果可以返回其他值,则意义不大,但如果它们代表某些东西的子计数,例如错误,则仍然有意义。 - Daniel Russell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接