Linux fork 后 wait 获取子进程结束的状态示例

Linux fork 后 wait 获取子进程结束的状态示例

文章图片




概览
使用 fork 后 , 可能需要获取 fork 的进程的运行状况 , 比如有没有异常、崩溃 。
【Linux fork 后 wait 获取子进程结束的状态示例】wait 在 man 中关键的描述如下:
All  of  these system calls are used to wait for state changes in a child of the calling process and obtain information about the child whose state has changed.  A state change is considered to be: the child terminated; the child was stopped by a signal; or the child was resumed by a signal.
示例代码#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
   pid_t pid;
   int status;

   printf(\"before fork\\");
   fflush(stdout);

   if ( (pid = fork()) < 0)
   {
       printf(\"fork error\\");
   
   else if (pid == 0)
   {
       printf(\"after fork child\\");

       // 4种测试情况
       exit(7); // -> normal termination exitstatus = 7
       // abort(); // -> abnormal termination signalstatus = 6 (SIGABRT)
       // int i = 1 / 0; // -> abnormal termination signalstatus = 8 (SIGFPE)
       // char *p = NULL; *p = 'a'; // -> abnormal termination signalstatus = 11 (SIGSEGV)
   

   wait(&status);
   
   if (WIFEXITED(status))
   {
       printf(\"normal termination exitstatus = %d\\" WEXITSTATUS(status));
   
   else if (WIFSIGNALED(status))
   {
       printf(\"abnormal termination signalstatus = %d\\" WTERMSIG(status)
#ifdef WCOREDUMP
       WCOREDUMP(status)?\"(core file generated)\":\"\");
#else
       \"\");
#endif
   
   else if (WIFSTOPPED(status))
   {
       printf(\"child stopped signal number = %d\\" WSTOPSIG(status));
   

   printf(\"after fork parent\\");

   return 0;


运行效果



    推荐阅读