zoukankan      html  css  js  c++  java
  • 进程控制中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
      ");
          // 可以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调用只能清理一个子进程

  • 相关阅读:
    用vbox搭建Linux服务器
    mysql数据库两表关联查询统计同一字段不同值的个数
    2019-06-16 Java学习日记之XML&tomcat
    2019-06-15 Java学习日记之mysql多表查询
    2019-06-14 Java学习日记之SQL
    2019-06-13 Java学习日记之MySql
    XML & Tomcat
    数据库的CRUD操作
    PrepareStatement
    Dao模式(data Access Object 数据访问对象)
  • 原文地址:https://www.cnblogs.com/fandx/p/12518114.html
Copyright © 2011-2022 走看看