【问题标题】:How to get the full returned value of a child process?如何获取子进程的完整返回值?
【发布时间】:2018-12-01 14:58:51
【问题描述】:

我需要捕获子进程的返回值..

问题是:使用waitpid() 函数我只能捕获返回值的 8 位

WEXITSTATUS(wstatus) 返回孩子的退出状态。这包括 子状态参数的最低有效 8 位 在对 exit(3) 或 _exit(2) 的调用中指定或作为参数指定 用于 main() 中的 return 语句。这个宏应该是 仅当 WIFEXITED 返回 true 时才使用。

如何捕获从 main() 返回的完整 int 值?

编辑:Stackoverflow 迫使我编辑该问题,因为它链接了另一个已回答的问题,但它与我的无关!

【问题讨论】:

    标签: c linux multithreading fork waitpid


    【解决方案1】:

    简短的回答是你几乎不能。传统上,Unix/Linux 下进程的退出状态是作为 8 位值传播的。你可以从main 返回任何你喜欢的整数,你可以用你喜欢的任何整数调用exit,但是只有低位8 位可以通过任何wait 函数提供给父级。

    WEXITSTATUS 被记录为仅返回状态的低 8 位的原因是只有这些位。

    如果您尝试将任意数据从子进程传递回其父进程,则退出状态不是执行此操作的方法。我,我通常将数据打印到标准输出,并让调用者使用popen 或等效方法捕获它。


    附录:我认为内核甚至没有记录完整的int 大小的退出状态,因此无法以任何方式检索它,但正如 davmac 在another answer 中解释的那样,您也许可以在SIGCHLD 处理程序中得到它。

    【讨论】:

    • “简短的回答是你不能” - 不完全正确,请参阅下面的答案。
    • @davmac 哦!谢谢。我不知道。 (我一直强烈回避SIGCHLD,因为我个人认为,普通人不可能实现SIGCHLD处理程序而不淹没在无休止的竞争条件下,但si_status这件事很高兴知道。)
    • “我一直强烈回避 SIGCHLD”——老实说,这可能是明智的。你是对的,信号处理通常很难正确处理。
    • 嗯,这很有趣——我写了一个测试程序来检查,结果发现 Linux 不遵守这个特殊的 POSIX 要求。 :( 请参阅我更新的答案。毕竟,这使您的答案完全正确。
    • @davmac 我一般对信号处理没有问题,但是是的,SIGCHLD 是毒蛇的巢穴。真是一团糟。 (而且这种与 Linux 和低 8 位的差异只会让情况变得更糟。)
    【解决方案2】:

    POSIX requires 完整的退出值将在 siginfo_t 结构的 si_status 成员中传递给 SIGCHLD 处理程序,如果它是通过调用 sigaction 并在标志:

    如果 si_code 等于 CLD_EXITED,则 si_status 保存进程的退出值;否则,它等于导致进程改变状态的信号。 si_status 中的退出值应等于完整的退出值(即传递给_exit()、_Exit() 或exit() 或从main() 返回的值); 不应限于该值的最低有效八位

    (强调我的)。

    请注意,经过测试,Linux 似乎不遵守此要求,并且仅返回 si_status 成员中退出代码的低 8 位。其他操作系统可能正确返回完整状态; FreeBSD 可以。 See test program here.

    但请注意,您是否会在每个子进程终止时收到一个单独的 SIGCHLD 信号并不完全清楚(可以合并信号的多个待处理实例),因此这种技术并非完全可靠。如果您需要超过 8 位,最好找到另一种方式在进程之间传递值。

    【讨论】:

      【解决方案3】:

      我相信你能得到它的唯一方法是通过straceing 进程并寻找退出系统调用s,现在似乎是exit_group,通过调试,或者可能通过使用像LD_PRELOAD 这样的丑陋黑客。 IE。没有什么不打扰的。

      对于僵尸进程,退出代码可以在last column of /proc/<pid>/stat 中找到,但它已经是& 0xFF

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-09
        • 1970-01-01
        • 2015-01-14
        • 2021-09-01
        • 2019-08-04
        • 2012-02-20
        • 2023-03-12
        • 2023-03-18
        相关资源
        最近更新 更多