我需要捕获子进程的返回值。
问题是:使用waitpid()函数,我只能捕获返回值的8位
WEXITSTATUS(wstatus) 返回子项的退出状态。这包括 子级状态参数的最低有效8位 在对exit(3)或_exit(2)的调用中指定,或作为参数 用于main()中的return语句。这个宏应该是 仅在WIFEXITED返回true时使用。
如何捕获main()
返回的完整int值?
编辑:Stackoverflow迫使我编辑问题,因为它链接了另一个已回答的问题,但与我无关!
答案 0 :(得分:4)
简短的答案是,您几乎做不到。传统上,Unix / Linux下进程的退出状态以8位值传播。您可以从main
返回任意整数,也可以使用任意整数调用exit
,但是只有低位8位可通过{{1 }}函数。
wait
被记录为仅返回状态的低8位的原因是,这些是仅有的位。
如果您尝试将任意数据从子流程传递回其父流程,则退出状态不是实现此目的的方法。我,我通常将数据打印到标准输出,然后让调用者使用WEXITSTATUS
或类似的方法捕获数据。
附录:我以为内核甚至都没有记录完整的popen
大小的退出状态,因此不可能通过任何方式检索它,但是正如davmac在another answer中解释的那样,您也许可以在int
处理程序中使用它。
答案 1 :(得分:4)
POSIX requires,如果通过调用{{1}适当地建立了完整的退出值,则在传递给SIGCHLD处理程序的si_status
结构的siginfo_t
成员中传递},并在标志中指定了sigaction
:
如果si_code等于CLD_EXITED,则si_status保存该进程的退出值;否则,si_status保留该进程的退出值。否则,它等于导致进程更改状态的信号。 si_status中的退出值应等于完整的退出值(即,传递给_exit(),_ Exit()或exit()或从main()返回的值); 它不应限于该值的最低有效八位。
(强调我的)。
请注意,经过测试,Linux似乎不满足此要求,并且仅返回si_status成员中退出代码的低8位。其他操作系统可能会正确返回完整状态。 FreeBSD可以。 See test program here。
但是请注意,这还不是很清楚,对于每个子进程终止,您都会收到一个单独的SIGCHLD信号(可以合并一个信号的多个挂起实例),因此这种技术并不是绝对可靠的。如果您需要超过8位,最好找到另一种在进程之间传递值的方法。
答案 2 :(得分:0)
我相信,获取此信息的唯一方法是通过strace
,然后通过以下方式寻找退出系统调用 s ,该调用现在看来是exit_group
:调试,或者可能使用诸如LD_PRELOAD
之类的丑陋骇客。即没有任何干扰。
对于僵尸进程,可以在last column of /proc/<pid>/stat
中找到退出代码,但已经是& 0xFF
。