我见过类似的问题here和here。答案建议使用WEXITSTATUS。但是根据WAIT(2)的手册页,它有一个局限性。它说: WEXITSTATUS(wstatus) 返回子项的退出状态。 由状态参数的最低有效8位组成,子级在调用exit(3)或_exit(2)时指定为子级,或者作为参数 用于main()中的return语句。仅当WIFEXITED返回true时,才应使用此宏。
因此,如果子级返回的值大于255,则父级将无法获得正确的值。我的问题是父进程如何接收大于255的返回值?谢谢
答案 0 :(得分:2)
这取决于操作系统及其对SA_SIGINFO
的支持。如果您仔细阅读了POSIX sigaction()
的规范,并且使用SA_SIGINFO
捕获了有关传递信号的更多信息,并且捕获了SIGCHLD
信号,那么您可能< / em>能够获得Signal Actions和<signal.h>
中所述的其他信息。
尤其是,<signal.h>
文档指出,当信号为SIGCHLD
时,则:
int si_status
如果
si_code
等于CLD_EXITED
,则si_status
保留进程的退出值;否则,它等于导致进程更改状态的信号。si_status
中的退出值应等于完整的退出值(即,传递给_exit()
,_Exit()
或exit()
或从{{1返回的值}});它不应限于该值的最低有效八位。
Linux sigaction()
的文档指示Linux上支持此功能。但是,与使用main()
或其功能系列之一相比,组织起来要困难得多,而且我还没有证明它确实可以像POSIX所指定的那样工作。
答案 1 :(得分:0)
我的问题是父进程如何接收大于255的返回值?
不能。进程的返回值必须为0到255。如果要在子级和父级之间传递任何其他值,则需要某种形式的进程间通信,例如管道。