【发布时间】:2011-03-14 04:52:03
【问题描述】:
是否有人碰巧知道退出状态代码 4479 (0x117f) 在 Ubuntu Linux 系统上的含义?我在没有程序编码的情况下得到了这个(我只有 EXIT_SUCCESS 和 EXIT_FAILURE,分别为 0 和 1),而且我似乎找不到 255 以上的此类代码列表。谢谢!
【问题讨论】:
标签: linux process exit exitstatus
是否有人碰巧知道退出状态代码 4479 (0x117f) 在 Ubuntu Linux 系统上的含义?我在没有程序编码的情况下得到了这个(我只有 EXIT_SUCCESS 和 EXIT_FAILURE,分别为 0 和 1),而且我似乎找不到 255 以上的此类代码列表。谢谢!
【问题讨论】:
标签: linux process exit exitstatus
这个 4479 或 0x117f 看起来像是从 C/C++ system() 调用返回的值(与 Unix 的 $? 预定义变量的值相反,它可能只有 0-255)。鉴于您使用的是 Linux,您很可能会使用 glibc。
所以在这种情况下,这个值不是 0-255 exit() 状态,而是像waitpid() 设置的状态一样格式化(可能包含退出状态,但在这种情况下可能没有) .
如果是这样,那么the source 告诉我WIFSTOPPED(4479) 将返回true,而WSTOPSIG(4479) 将返回17。(有关更多信息,请参阅waitpid() 手册页。)因此返回4479 的过程还没有退出,还在那里,但被信号 17 拦住了。
Signal 17 is SIGCHLD(至少如果您在 x86 上运行 Linux),这意味着“子 [进程] 已停止或终止”。
在不了解您的特定应用程序上下文的情况下,我不知道为什么会出现 SIGCHLD。
【讨论】:
貌似这是从wait() or waitpid()获取的status值,和退出状态不一样。应在 status 值上使用宏 WIFEXITED()、WIFSIGNALED()、WIFSTOPPED() 和 WIFCONTINUED() 以确定其含义。在这种情况下,WIFSTOPPED() 看起来对于这个 status 值是正确的,这意味着子进程已停止。
【讨论】:
WIFSTOPPED() 为真,则表明进程已停止(暂停),而不是终止。至于 stderr 上的消息(例如“分段错误”),由 shell 显示,用于它自己的子进程。在这种情况下,进程是您的子进程,而不是 shell 的子进程,因此如果您想向用户报告其状态(您可以使用 psignal 或 psiginfo:kernel.org/doc/man-pages/online/pages/man3/psignal.3.html),则由您负责。