【问题标题】:What does WEXITSTATUS(status) return?WEXITSTATUS(status) 返回什么?
【发布时间】:2023-03-25 01:25:01
【问题描述】:

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

这里是sn-p:

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

WEXITSTATUS的返回值如何计算?

【问题讨论】:

  • 如果所有命令都成功,那么counter中的值将为零;如果任何命令以失败(非零)状态退出,counter 中的值将非零。如果您运行的命令太多以至于遇到溢出问题,那么即使几乎一切都失败了,您也可能会巧合地得到 0,但这种可能性很小。请注意,如果命令因信号 (WIFSIGNALED) 而死,则 WEXITSTATUS 将为零,但命令仍然失败。
  • 对。我理解那部分。我真的很想知道根据接收到的信号将状态值设置为什么。 WIFSIGNALED、WIFSTOPPED 等是否将状态设置为整数值?我们怎么知道这个值是什么?
  • evaluate status,包含进程的退出代码。如果进程 12345 调用 exit(7) 而你 waitpid(12345, &status, 0) 那么 WEXISTATUS(status) 将产生 7

标签: c unix signals posix fork


【解决方案1】:

WEXITSTATUS(stat_val) 是一个宏(所以实际上它不会“返回”某事,而是“评估”某事)。

关于它的工作原理,您可能想在您使用的 C 编译器随附的标头(应该是 #included 和 <sys/wait.h>)中查找它。

此宏的实现可能因一种 C 实现而异。

请注意,如果宏 WIFEXITED(stat_val) 给您的值不等于 0,则此宏只会给出合理的值。

waitpid()'s POSIX specification逐字逐句:

WEXITSTATUS(stat_val)

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


添加特定程序的返回码背后的动机只有代码的作者和希望现有的文档知道。

【讨论】:

  • 我提到了 man waitpid。我无法运行这段代码。我应该如何获取 status 参数的低 8 位的值?如何获取 status 采用的整数值?
  • @shaveenk:您是“...无法运行...”还是无法编译此代码?你得到了哪些错误?
猜你喜欢
  • 2013-10-09
  • 2014-05-16
  • 2019-11-05
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多