【问题标题】:The return code of an application is an int16_t?应用程序的返回码是 int16_t?
【发布时间】:2021-04-13 03:30:44
【问题描述】:

当谈到开始一个新进程时,你可以使用int system(char* command)。如果你传递一个非NULL参数,你可以得到:

  • -1如果子进程无法启动;
  • 否则为子进程的返回码;

注意:在 Unix/Linux 中,返回码位于 结果的高八位,而低八位包含终止原因代码>{1}

WEXITSTATUS() 中搜索the implementation 是向右移位8 位。

#define WEXITSTATUS(x) (_W_INT(x) >> 8)

这就是为什么我倾向于认为返回码是 2 个字节(也来自 >{1}

P.s 我想知道返回码和终止原因码的区别,不都一样吗?

【问题讨论】:

  • 适用于什么操作系统?符合 POSIX 标准?
  • “在线找到的 C 课程”。谨慎对待这些事情。 int system(char* command) 运行一个可执行程序,而不是“C/C++ 应用程序”(无论这意味着什么)。返回码不依赖于用于编写所述程序的语言。
  • 终止原因码:进程是自行退出,还是被信号杀死?在后一种情况下,由于希望显而易见的原因,它没有返回代码,但您可以找出是什么信号负责,以及是否进行了核心转储。
  • @πάνταῥεῖ ,DWORD 在 Windows 中是无符号的,这意味着它仍然不能有负值。或者我做了read wrong
  • 您应该使用#include <sys/wait.h> 定义的宏来从状态中提取信息,而不是通过您自己的代码进行位移。 WEXITSTATUS(x) 提取的退出代码仅在 WIFEXITED(x) 非零时有效。同样,WTERMSIG(x) 仅在 WIFSIGNALED(x) 不为零时才有效。

标签: c++ c operating-system


【解决方案1】:

有不同的终止原因:

  • 进程终止调用return(无论是否明确)
  • 信号传递后进程终止
  • 进程在信号传递后停止。这不是真正的终止,但需要在许多情况下被捕获。

对于这些终止中的每个,可以分别访问一个代码:

  • 返回值(只有低八位)
  • 信号编号
  • 信号编号

【讨论】:

  • 根据 POSIX,被信号杀死的进程的状态将是“大于 128”。通常是 128 + 信号号。
  • @AndrewHenle 对,但是使用预定义的函数/宏比自己解码值更好。
猜你喜欢
  • 2015-02-10
  • 1970-01-01
  • 2021-01-06
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
相关资源
最近更新 更多