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;


運行效果



    推薦閱讀