【问题标题】:Exit status code 4479退出状态码 4479
【发布时间】:2011-03-14 04:52:03
【问题描述】:

是否有人碰巧知道退出状态代码 4479 (0x117f) 在 Ubuntu Linux 系统上的含义?我在没有程序编码的情况下得到了这个(我只有 EXIT_SUCCESS 和 EXIT_FAILURE,分别为 0 和 1),而且我似乎找不到 255 以上的此类代码列表。谢谢!

【问题讨论】:

    标签: linux process exit exitstatus


    【解决方案1】:

    这个 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。

    【讨论】:

    • 非常感谢!如果你有时间,请看我下面的后续。
    【解决方案2】:

    貌似这是从wait() or waitpid()获取的status值,和退出状态不一样。应在 status 值上使用宏 WIFEXITED()WIFSIGNALED()WIFSTOPPED()WIFCONTINUED() 以确定其含义。在这种情况下,WIFSTOPPED() 看起来对于这个 status 值是正确的,这意味着子进程已停止。

    【讨论】:

    • 我明白了。感谢你们(Marnix Klooster 和 mark4o)。这确实是 waitpid 从子进程中捕获的值,因此系统使用 SIGCHLD 杀死子进程是有道理的。然而,这引发了系统为什么杀死子进程的问题。如果子进程导致分段错误,内核是否会在不向 stderr 打印“分段错误”消息的情况下发送 SIGCHLD?再次感谢。
    • 如果WIFSTOPPED() 为真,则表明进程已停止(暂停),而不是终止。至于 stderr 上的消息(例如“分段错误”),由 shell 显示,用于它自己的子进程。在这种情况下,进程是您的子进程,而不是 shell 的子进程,因此如果您想向用户报告其状态(您可以使用 psignal 或 psiginfo:kernel.org/doc/man-pages/online/pages/man3/psignal.3.html),则由您负责。
    猜你喜欢
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2018-07-27
    • 1970-01-01
    • 2018-10-16
    • 2013-06-15
    相关资源
    最近更新 更多