如何获取使用exec创建的子进程返回其父进程的返回值?

时间:2018-10-10 02:43:15

标签: c linux exec wait waitpid

我见过类似的问题herehere。答案建议使用WEXITSTATUS。但是根据WAIT(2)的手册页,它有一个局限性。它说: WEXITSTATUS(wstatus)               返回子项的退出状态。 由状态参数的最低有效8位组成,子级在调用exit(3)或_exit(2)时指定为子级,或者作为参数               用于main()中的return语句。仅当WIFEXITED返回true时,才应使用此宏。

因此,如果子级返回的值大于255,则父级将无法获得正确的值。我的问题是父进程如何接收大于255的返回值?谢谢

2 个答案:

答案 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。如果要在子级和父级之间传递任何其他值,则需要某种形式的进程间通信,例如管道。