如何获取子进程的完整返回值?

问题描述 投票:0回答:3

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

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

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

如何捕获从

main()
返回的完整 int 值?

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

c linux multithreading fork waitpid
3个回答
7
投票

waitid
函数允许您检索进程的完整 (
int
) 退出状态,作为其填充的
siginfo_t
结构的一部分。

POSIX 还要求,如果通过调用

si_status
(并在标志:

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

(强调我的)。 请注意,经过测试,Linux 似乎不满足此要求,并且仅返回 si_status 成员中退出代码的低 8 位

。其他操作系统可能会正确返回完整状态; FreeBSD 确实如此。
请参阅此处的测试程序

但请注意,并不完全清楚您将为每个子进程终止收到一个单独的 SIGCHLD 信号(可以合并信号的多个待处理实例),因此该技术并非完全可靠。如果您需要超过 8 位,最好找到另一种在进程之间传递值的方法。 简短的回答是你几乎不能。 传统上,Unix/Linux 下进程的退出状态以 8 位值的形式传播。 您可以从

siginfo_t

返回任何您喜欢的整数,您可以使用您喜欢的任何整数调用

sigaction

6
投票
SA_SIGINFO

函数提供给父级。


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

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

exit

或等效工具捕获它。


附录:我认为内核甚至没有记录完整的

wait

大小的退出状态,因此不可能通过任何方式检索它,但正如davmac在
另一个答案

中解释的那样,你也许能够将其放入
WEXITSTATUS

处理程序中。

    
我相信你能得到它的唯一方法是通过
popen
ing进程并寻找退出系统调用

s

0
投票
int

,通过调试,或者可能通过使用一些丑陋的黑客,如

 SIGCHLD
。 IE。没有什么不打扰的。 对于僵尸进程,退出代码可以在
strace
最后一列中找到,但它已经是

exit_group

	
© www.soinside.com 2019 - 2024. All rights reserved.