wait  
 阻塞函数  
 
 
 函数作用:  
 
 
 1. 
 阻塞并等待子进程退出  
 
 
 2. 
 回收子进程残留资源  
 
 
 3. 
 获取子进程结束状态(退出原因) 
 
 
 
  pid_t wait(int *wstatus);  
 
 
  
  返回值:  
 
 
  
  ‐1 :  
  回收失败,已经没有子进程了  
 
 
  
  >0 :  
  回收子进程对应的 
  pid  
 
 
  
  参数 : 
 
 
  
   status 
   判断子进程如何退出状态  
  
 
   
   1.WIFEXITED(status): 
   为非 
   0  
   ,进程正常结束  
  
 
   
   返回WEXITSTATUS(status)  
  
 
   
   如上宏为真,使用此宏,获取进程退出状态的参数  
  
 
   
   2.WIFSIGNALED(status): 
   为非 
   0 
   ,进程异常退出  
  
 
   
   WTERMSIG(status):  
  
 
   
   如上宏为真,使用此宏,取得使进程种植的那个信号的编号  
  
 
   
   调用一次只能回收一个子进程  
  
 
   
   
    waitpid 
    函数  
   
 
    
    函数作用:同 
    wait 
    函数  
   
 
    
    
     pid_t waitpid(pid_t pid, int *status, int options);  
    
 
     
     参数  
    
 
     
     1.pid:  
     指定回收某个子进程  
    
 
     
     pid == ‐1  
     回收所有子进程  
    
 
     
     while( (wpid=waitpid(‐1,status,0)) != ‐1)  
    
 
     
     pid > 0  
     回收某个 
     pid 
     相等的子进程  
    
 
     
     pid == 0  
     回收当前进程组的任一子进程  
    
 
     
     pid < 0  
     子进程的 
     PID 
     取反(加减号)  
    
 
     
     2.status:  
     子进程的退出状态,用法同 
     wait 
     函数  
    
 
     
     3.options: 
     设置为 
     WNOHANG, 
     函数非阻塞,设置为 
     0 
     ,函数阻塞  
    
 
     
     返回值:  
    
 
     
     >0 : 
     返回清理掉的子进程 
     ID  
    
 
     
     ‐1  
     :回收失败,无子进程  
    
 
     
     如果为非阻塞  
    
 
     
     =0  
     :参数 
     3 
     为 
     WNOHANG, 
     且子进程正在运行  
    
 
     
    #include <sys/types.h>
#include <unistd.h>
#include<stdio.h>
#include<sys/wait.h>
int i=200;
int main()
{
int status;
pid_t pid;
pid = fork();
if (pid>0)
{
        pid_t wpid;
        wpid=wait(&status);
        printf("wpid is %d\n",wpid);
        //nomal exit 
        if (WIFEXITED(status))
        {
        printf("nomal exit value is %d\n",WEXITSTATUS(status));
        }
        //unnomal
        if(WIFSIGNALED(status))
        {
        printf("unnomal exit signal is %d\n",WTERMSIG(status));
        
        }
        i+=400;
printf("this is father process %d\n",getpid());
printf("i=%d\n",i);
}
else if(pid==0)
{
while(1)
{
        sleep(1);
printf("this is child  process %d,ppid is%d\n",getpid(),getppid());
printf("i=%d\n",i);
}
}
for(int i=0;i<3;i++)
{
printf("------i=%d\n",i);
}
 
 
  
    程序一直执行子进程 
  
 
  
    此时打开另一个终端,终止进程,返回终止进程(异常退出)的信号 9 
  
 
   
 
  
    waitpid 
  
 
  #include <sys/types.h>
#include <unistd.h>
#include<stdio.h>
#include<sys/wait.h>
int i=200;
int main()
{
pid_t pid;
pid = fork();
if (pid>0)
{       int status;
        pid_t wpid;
        while((wpid=waitpid(-1,&status,WNOHANG))!=-1)
        {
               
        printf("deid wpid is %d\n",wpid);
        //nomal exit
        if (WIFEXITED(status))
        {
        printf("nomal exit value is %d\n",WEXITSTATUS(status));
        }
        //unnomal
        if(WIFSIGNALED(status))
        {
        printf("unnomal exit signal is %d\n",WTERMSIG(status));
        }
        i+=400;
printf("this is father process %d\n",getpid());
printf("i=%d\n",i);
        }
}
else if(pid==0)
{
printf("this is child  process %d,ppid is%d\n",getpid(),getppid());
}
for(int i=0;i<3;i++)
{
printf("------i=%d\n",i);
}
return 0;
}

#include <sys/types.h>
#include <unistd.h>
#include<stdio.h>
#include<sys/wait.h>
int i=200;
int main()
{
pid_t pid;
pid = fork();
if (pid>0)
{       int status;
        pid_t wpid;
        while((wpid=waitpid(-1,&status,WNOHANG))!=-1)
        {
if(wpid==0)
{
continue;
}
               
        printf("deid wpid is %d\n",wpid);
        //nomal exit
        if (WIFEXITED(status))
        {
        printf("nomal exit value is %d\n",WEXITSTATUS(status));
        }
        //unnomal
        if(WIFSIGNALED(status))
        {
        printf("unnomal exit signal is %d\n",WTERMSIG(status));
        }
        i+=400;
printf("this is father process %d\n",getpid());
printf("i=%d\n",i);
        }
}
else if(pid==0)
{
printf("this is child  process %d,ppid is%d\n",getpid(),getppid());
}
for(int i=0;i<3;i++)
{
printf("------i=%d\n",i);
}
return 0;
}




















