进程控制中wait和waitpid的区别和用法

wait函数(回收子进程)

进程结束,会在内存中存留PCB进程控制块,需要使用wait来回收

函数的3个功能

  • 阻塞等待子进程退出

  • 回收子进程的残留资源

  • 获取子进程的结束状态

  • pid_t wait(int *stat_loc);

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <pthread.h>
    
    int main(int agrc, char *argv[])
    {
      pid_t pid, wpid;
      int status;
      
      pid_t pid = fork();
      if (pid==-1){
        perror("fork error");
        exit(1);
      }else if(pid==0){ // 子进程
       sleep(10);
        printf("child die ----------");
        return 73;
      }else if (pid>0){  // 父进程
        printf("I'm parent: %d\n");
        // 可以status传入null, 不关心子进程结束原因
        wpid = wait(&status);
        if(wpid == -1){
          perror("wait error");
          exit(1);
        }
        if (WIFEXITED(status)){
    				printf(WEXITSTATUS(status));
        }// 为真, 说明子进程正常终止
        
        if (WIFSIGNALED(status)){
          	printf("child kull with signal", WTERMSIG(status));
        } // 非正常终止
        
      }
      
      return 0;
      
    }
    

waitpid函数

pid_t waitpid(pid_t pid, int *stat_loc, int options);

pid的值

  • 当pid=-1的时候,可以直接回收所有的子进程
  • pid > 0 的时候 回收指定id的子进程
  • pid=0 的时候回收当前调用waitpid一个组的所有子进程
  • pid <-1 回收指定进程组内的任意子进程

options的值

当options的值为WNOHANG指定回收方式为,非堵塞

返回值

  • >0:表示成功回收子进程的Pid
  • =0:函数调用的时候,参数3指定了WNOHANG, 并且没有子进程结束
  • -1:失败的时候会返回-1

waitpid(-1, &status, 0) == wait(&status);

不管用wait还是waitpid调用只能清理一个子进程

posted @ 2020-03-18 16:19  FANDX  阅读(503)  评论(0编辑  收藏  举报