第八章 进程控制 wait函数

wait(等待子进程中断或结束)

表头文件
     #include<sys/types.h>
     #include<sys/wait.h>
定义函数 pid_t wait (int * status);
函数说明:
    wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
    如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。
    子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。
   如果不在意结束状态值,则参数 status 可以设成 NULL。
     子进程的结束状态值请参考 waitpid( )     
如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回返回值-1。失败原因存于 errno 中。
pid_t  pid1;  int status=0;     
i=wait(&status);
i返回的是子进程的识别码;PID
status中存的是子进程的结束状态;可用WEXITSTATUS(status)得到子进程的exit(3)的状态,那么就是3;

 #include "apue.h"
 #include <sys/wait.h>

 void pr_exit(int status)
 {
   if(WIFEXITED(status))
   {
     printf("normal termination,exit status = %d\n",WEXITSTATUS(status));
   }
   else if(WIFSIGNALED(status))
   {
     printf("abnormal termination,signal number = %d%s\n",
         WTERMSIG(status),
 #ifdef WCOREDUMP
         WCOREDUMP(status)? "(core file generated)":"");
 #else
         "");
 #endif
   }

   else if(WIFSTOPPED(status))
   {
     printf("child stopped,signal number =%d\n",WSTOPSIG(status));
   }
 }


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

   if((pid=fork())<0)
   {
     err_sys("fork error");
   }
   else if(pid==0)
   {
     //child
     exit(7);
   }

   if(wait(&status)!=pid)
   {
     err_sys("wait error");
   }


  pr_exit(status);

  if((pid=fork())<0)
  {
    err_sys("fork error");
  }
  else if(pid==0)
  {
    abort();//generates SIGABRT
  }

  if(wait(&status)!=pid)
  {
    err_sys("wait error");
  }
  pr_exit(status);

  if((pid=fork())<0)
  {
    err_sys("fork error");
  }
  else if(pid==0)
  {
    //child
    status/=0;//generates SIGFPE
  }

  if(wait(&status)!=pid)
  {
    err_sys("wait error");
  }

  pr_exit(status);

  exit(0);

}

jiang@AY140524110335068908Z:~/new_apue$ ./a.out
normal termination,exit status = 7
abnormal termination,signal number = 6
abnormal termination,signal number = 8
jiang@AY140524110335068908Z:~/new_apue$

你可能感兴趣的:(第八章 进程控制 wait函数)