我正在尝试理解 WEXITSTATUS(status)
的工作原理。我遇到了一段代码,其中WEXITSTATUS(status)
的返回值被添加到一个变量中。
以下是代码片段:
waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);
如何计算WEXITSTATUS
的返回值?
WEXITSTATUS(stat_val)
是一个宏(因此实际上它并不“返回”任何东西,而是“评估”为某个值)。
如果想要了解它的工作原理,您可能需要查看您所使用的 C 编译器的头文件(应该通过 <sys/wait.h>
引入)。
这个宏的实现可能因 C 实现而异。
请注意,只有当宏 WIFEXITED(stat_val)
给出非零值时,此宏才提供合理的值。
WEXITSTATUS(stat_val)
如果 WIFEXITED(stat_val) 的值非零,那么此宏将计算子进程传递给 _exit() 或 exit() 的状态参数的低 8 位,或子进程从 main() 返回的值。
将特定程序的返回代码相加的动机仅为代码作者和希望存在的文档所知。
counter
中的值将为零;如果任何一个命令以失败(非零)状态退出,则counter
中的值将为非零。如果运行的命令太多而遇到溢出问题,则可能会巧合地获得0,即使几乎所有命令都失败了,但这种情况的概率非常小。请注意,如果命令因信号(WIFSIGNALED)而死亡,则 WEXITSTATUS 将为零,但该命令仍然失败。 - Jonathan Lefflerstatus
,其中包含进程的退出代码。如果进程12345调用exit(7)
并且您使用waitpid(12345, &status, 0)
,那么WEXISTATUS(status)
将产生7
。 - Matthew Read