精华内容
下载资源
问答
  • 图控大叔构图传递思想阅读从未如此简单!!!01前言 在进程的开发中,我们常常需要创建子进程来实现进程的“分身”,但是子进程执行完任务...02函数讲解wait()函数说明wait函数需要包含头文件#include#include函数...
    68e343ec73ff6754d0a7e3aa50ffa2ff.png

    图控大叔

    构图传递思想

    阅读从未如此简单!!!

    01

    前言

           在进程的开发中,我们常常需要创建子进程来实现进程的“分身”,但是子进程执行完任务之后,需要父进程对其进行资源回收,否则该子进程将变成僵尸进程。那么父进程对子进程的资源回收所用到的函数则有我们今天的主角:wait和waitpid。

    02

    函数讲解

    df2bbdc6a407b63dd4de89fbfe8155cd.gifwait()函数说明
    wait函数

    需要包含头文件
    #include 
    #include 

    函数原型
    pid_t wait (int * status);

    参数说明:
    1、如果父进程需要知道子进程结束时候的状态值.则可以填充参数
      如:
        int status;
        //创建子进程及相应判断
        printf("wait(&status) is %d\n",wait(&status));
    2、如果父进程不需要知道子进程结束时候的状态值.则可以填充NULL
      如:
        int status;
        //创建子进程及相应判断
        printf("wait(NULL) is %d\n",wait(NULL));

    返回值
      1-1 ---》该子进程不存在
      2、 子进程pid
      
    其他说明
    1、wait函数的调用暂时停止目前进程的执行, 直到有信号来到或子进程结束
    2、如果同时创建了多个子进程,并且这些子进程都有调用退出函数,如:exit
       哪个子进程先介绍,wait就先返回哪个子进程的pid值
      (小编做了好多次测试,发现都是其他一样效果,后来在老师的指导下才纠正了这个思维定式的问题)
    df2bbdc6a407b63dd4de89fbfe8155cd.gifwaitpid()函数说明
    waitpid函数

    需包含头文件
    #include 
    #include 

    函数原型
    pid_t waitpid(pid_t pid, int * status, int options);

    参数说明:
    pid:
       pid<-1 等待进程组识别码为 pid 绝对值的任何子进程.
       pid=-1 等待任何子进程, 相当于 wait().
       pid=0  等待进程组识别码与目前进程相同的任何子进程. (和wait()一样)
       pid>0  等待任何子进程识别码为 pid 的子进程.
       说明:pid 乱填,该进程组内没有此pid的子进程,会返回-1
       
    status:
      用法和wait一样
      
    options:
    一般填0,有以下其他种选择,小编还没有弄懂,以后弄懂了再补充

    其他选择为:
    WNOHANG
      如果没有任何已经结束的子进程则马上返回, 不予以等待.
    WUNTRACED
      如果子进程进入暂停执行情况则马上返回, 但结束状态不予以理会.
      子进程的结束状态返回后存于 status, 底下有几个宏可判别结束情况
    WIFEXITED(status)
      如果子进程正常结束则为非 0 值.
    WEXITSTATUS(status)
      取得子进程 exit()返回的结束代码,
      一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏.
    WIFSIGNALED(status)
      如果子进程是因为信号而结束则此宏值为真
    WTERMSIG(status)
      取得子进程因信号而中止的信号代码, 一般会先用 WIFSIGNALED 来判断后才使用此宏.
    WIFSTOPPED(status)
      如果子进程处于暂停执行情况则此宏值为真. 一般只有使用 WUNTRACED 时才会有此情况.
    WSTOPSIG(status)
      取得引发子进程暂停的信号代码, 一般会先用 WIFSTOPPED 来判断后才使用此宏.

    返回值:
      和wait一样。
      
    其他说明:

    waitpid
      1、如果所填pid所对应子进程不存在,则立即返回-1
      2、如果所填pid存在,但是一直不退出,则一直等待
        该子进程不退出为可能
          1、调用了pause()
          2、vfork函数创建的子进程未调用exit
            因为fork函数创建的子进程调用return或者exit都可以退出
          3、一直处于while循环中
          4、还有其他情况,小编可能不知道
    a792189d8f28db5eca94c2b5c79d27a1.png01

    图片补充

    03

    代码

    df2bbdc6a407b63dd4de89fbfe8155cd.gif参考测试代码
    #include 
    #include 

    int main(int argc,const char **argv){
      pid_t cpid[2];
      int status;
      
      cpid[0] = fork();

      if(cpid[0] == -1)
      {
        perror("进程1创建失败\n");
        return -1;
      }
      else if(cpid[0]==0)
      {

          printf("client1 id %d father id %d\n",getpid(),getppid());
          //sleep(0);
          //pause();
            exit(0);
      }
      
      cpid[1] = fork();
      //printf("开始 2\n");
      if(cpid[1] == -1)
      {
        perror("进程2创建失败\n");
        return -1;
      }
        if(cpid[1]==0)
      {

            printf("client2 id %d father id %d\n",getpid(),getppid());
            //sleep(2);
            //pause();
            //return 0;
                 exit(0);
      }
      else{
          //wait(&status);
        
          //printf("wait is %d\n",wait(&status));//首先结束第一个创建的子程序
          //printf("wait is %d\n",wait(&status));
          //printf("wait(&status) is %d\n",wait(&status));
          printf("wait is %d\n",waitpid(cpid[1],&status,WIFEXITED(status)));
          //printf("wait cpid[1] %d is %d\n",cpid[1],waitpid(cpid[1],&status,0));
      
          printf("father id is %d\n",getpid());
        
      }
      return 0;
    }

    04

    留个问题

           exit函数让调用者所对应进程结束,那么exit函数有负责进程资源的回收吗?答案是没有。exit和wait有什么不一样?当然有,自己总结!

    05

    结尾

           本次关于Linux环境下子进程内存资源的回收所涉及的部分函数:wait和waitpid就分享到这里,如有纰漏,希望不吝赐教!谢谢阅读!

    展开全文
  • 当一个进程结束时,会产生一个终止状态字,然后内核发出一个SIGCHLD信号通知父...下面我们来了解下wait和waitpid这两个函数:要使用这两个函数需要引入sys/wait.h头文件和sys/types.h头文件我们来看下wait函数的格式...

    当一个进程结束时,会产生一个终止状态字,然后内核发出一个SIGCHLD信号通知父进程,因为子进程的结束对于父进程是异步的,因而这个信号对于父进程也是异步的,父进程可以不响应,也可以调用wait或waitpid函数进行处理,默认情况是不响应。

    下面我们来了解下wait和waitpid这两个函数:

    要使用这两个函数需要引入sys/wait.h头文件和sys/types.h头文件

    我们来看下wait函数的格式:

    __pid_t wait (int *__stat_loc);

    上面参数stat_loc是一个整形的指针,如果它不为空,子进程的终止状态字就被存放在该参数指定的内存位置,如果不关心终止状态字,传入一个空指针就可以了。

    传统上,返回的这个状态字是一个整数,特定位表示特定的信息,如某些位表示退出状态(对于正常结束的进程),某些为表示终止原因(对于异常终止的进程),还有其他一些标记位,具体实现可能略有差异,系统屏蔽了实现的细节,可以调用wait头文件中的几个宏得到相关信息:

    我们来看看有那几个宏:

    a0040315fc5355cf1f59fd374a3671ff.png

    如果一个进程调用了wait或waitpid函数,可能会产生以下3种情况:

    1、 如果所有子进程都还在运行,进程挂起;

    2、 如果恰有子进程结束,它的终止状态字正等待父进程提取,立即得到该终止状态字并返回,其返回值为该子进程的进程号;

    3、 如果该进程没有子进程,立即返回,返回值为-1;

    可以看到,如果收到SIGCHLD信号后调用这两个函数,由于有子进程结束,因此,可以立即正确返回,否则,在程序某一点随机地调用,则进程很可能被挂起,这时,如果进程有多个子进程,就等待直至有一个子进程结束,然后返回该子进程的终止状态字,父进程可以根据返回的进程ID判断是哪个子进程结束了。

    下面我们来看一个例子:

    eb1f589f9144ec35a1c50d0ed6b31cdf.png

    如果某个进程有多个子进程,wait返回任一子进程的终止状态字,那么如果要等待某个特定的子进程结束(假设知道要等待的子进程的ID),该怎么办呢?

    我们可以循环调用wait函数,然后将返回的进程ID 与感兴趣的那个进程ID比较,如果两者不等就将相关信息保存起来,在继续等待,直至等到所等待的那个进程结束,下一次类似操作时,又要先遍历一遍以前保存过的已结束的子进程信息,看其中是否有感兴趣的进程,在根据情况调用wait函数,显然,这样循环十分麻烦,幸好linux提供了另一个函数waitpid,使用这个函数不仅可以指定等待某个进程,而且还提供了其他一些参数选择,具有很大的灵活性。

    我们来看下waitpid的调用格式:

    __pid_t waitpid (__pid_t __pid, int *__stat_loc, int __options);

    我们用一个表来了解pid的值的含义

    da29d31155408d374f927e70aa683cdc.png

    waitpid函数返回子进程的进程ID,子进程的终止状态字存放在stat_loc指向的地址中。

    参数options进一步控制waitpid的运行,它可以取零,也可以取一些常数,或是常数的组合,一个常用的常数是WNOHANG,使用这个常数,即使pid指定的子进程的终止状态字不能立即得到,waitpid也不会挂起,而是返回零。

    可以看到wait其实是waitpid的一个特例,等价于waitpid(-1,*statloc,0)。

    好了我们再来看一个例子:

    90862539a6312fca4640f3093a224ed4.png

    上面这段代码,进程创建了第一个子进程,第一个子进程又创建了一个子进程,然后第一个子进程结束(第20行),第2个子进程是第一个子进程的子进程,而不是原进程的子进程,因此第一个子进程结束后它就成为了zombie(僵尸进程),被init接管,而init的进程号为1,所以显示的父进程ID为1.

    展开全文
  • waitpid

    2014-11-24 14:34:46
    头文件:#include #include 定义函数:pid_t waitpid(pid_t pid, int * status, int options); 函数说明:waitpid()会暂时停止目前进程的执行, 直到有信号来到或子进程结束. 如果在调用wait()时子进程已经...
    相关函数:wait, fork

    头文件:#include <sys/types.h>    #include <sys/wait.h>

    定义函数:pid_t waitpid(pid_t pid, int * status, int options);

    函数说明:waitpid()会暂时停止目前进程的执行, 直到有信号来到或子进程结束. 如果在调用wait()时子进程已经结束, 则wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数status 返回, 而子进程的进程识别码也会一快返回. 如果不在意结束状态值, 则参数status 可以设成NULL. 参数pid 为欲等待的子进程识别码, 其他数值意义如下:

    1、pid<-1 等待进程组识别码为pid 绝对值的任何子进程.
    2、pid=-1 等待任何子进程, 相当于wait().
    3、pid=0 等待进程组识别码与目前进程相同的任何子进程.
    4、pid>0 等待任何子进程识别码为pid 的子进程.


    参数option 可以为0 或下面的OR 组合:

    WNOHANG:如果没有任何已经结束的子进程则马上返回, 不予以等待.
    WUNTRACED:如果子进程进入暂停执行情况则马上返回, 但结束状态不予以理会. 子进程的结束状态返回后存于status, 底下有几个宏可判别结束情况
    WIFEXITED(status):如果子进程正常结束则为非0 值.
    WEXITSTATUS(status):取得子进程exit()返回的结束代码, 一般会先用WIFEXITED 来判断是否正常结束才能使用此宏.
    WIFSIGNALED(status):如果子进程是因为信号而结束则此宏值为真
    WTERMSIG(status):取得子进程因信号而中止的信号代码, 一般会先用WIFSIGNALED 来判断后才使用此宏.
    WIFSTOPPED(status):如果子进程处于暂停执行情况则此宏值为真. 一般只有使用WUNTRACED时才会有此情况.
    WSTOPSIG(status):取得引发子进程暂停的信号代码, 一般会先用WIFSTOPPED 来判断后才使用此宏.


    返回值:如果执行成功则返回子进程识别码(PID), 如果有错误发生则返回-1. 失败原因存于errno 中.

    范例:参考wait().
    展开全文
  • 头文件

    2014-09-03 14:56:00
    1: NULL stdio.h 2: exit stdlib.h 3: execlp fork unistd.h 4: strlen string.h 5:EXIT_SUCCESS EXIT_FAILURE stdlib.h ...6: waitpid sys/wait.h 7: STDIN_FILENO STDOUT_FILENO unistd.h 转载于:https://...

    1: NULL stdio.h

    2:  exit    stdlib.h

    3: execlp fork unistd.h

    4: strlen   string.h

    5:EXIT_SUCCESS EXIT_FAILURE stdlib.h

    6: waitpid   sys/wait.h

    7: STDIN_FILENO STDOUT_FILENO unistd.h

    转载于:https://www.cnblogs.com/gavinwu/p/3953700.html

    展开全文
  • waitpid笔记

    2019-06-03 11:37:56
    //头文件 #include <sys/types.h> #include <sys/wait.h> //函数原型 pid_t waitpid(pid_t pid,int *status,int options); 从本质上讲,waitpid是wait的封装,waitpid只是多出了两个可由用户控制的参数...
  • 1、头文件  #includesys/types.h> #include 2、函数原型  pid_t waitpid(pid_t pid,int * status,int options); 3、函数参数 waitpid函数有三个参数:pid和指向返回状态所在单元的指针和一个...
  • wait waitpid

    2015-08-05 17:40:52
    wait函数所需头文件:  #include #include wait函数原型: pid_t wait(int *status); 进程一旦调用了 wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个...
  • wait和waitpid详解

    千次阅读 2020-11-03 22:58:17
    wait和waitpid详解 1、wait 头文件 #include <sys/types.h> #include <sys/wait.h> 函数原型 pid_t wait(int *status); 参数 status:代表返回状态,成功调用返回子进程pid,如果没有子 进程调用...
  • wait 和 waitpid 区别

    千次阅读 2013-06-14 15:05:29
    1、当一进程终止的时候,如果想要...包涵的头文件 #includesys/types.h> #include 函数原型如下: pid_t wait (int * status); pid_t waitpid(pid_t pid,int * status,int options); status 是一个整形指针,存
  • 进程等待wait和waitpid

    2020-02-14 19:05:40
    wait和waitpid所需要的头文件 #include <sys/types.h> #include <sys/wait.h> 1.wait用法 pid_t wait(int*status); 参数:输出型参数,获取子进程退出状态,不关心则可以设置为...
  • wait和waitpid

    2015-01-27 20:03:20
    头文件:#include pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); 这两个函数都是用于去侦察子进程的,就像是两个侦察兵,看看子进程的状态 如果子进程的状态变化了,这些...
  • 无论是要使用wait还是waitpid都要先引入头文件 #include <sys/types.h> #include <sys/wait.h> waitpid: pid_t waitpid(pid_t pid,int *statusp,int options) 参数: pid:pid>0:只等待进程ID等于pid...
  • wait函数和waitpid函数

    2016-12-24 20:43:32
    当前进程一旦调用了wait函数,就立即阻塞当前进程,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集...相关函数 waitpid,fork 需要头文件 #include
  • 展开全部当有多个子进程的SIGCHLD信号到达父进程的时候,如果父进程用wait等待,那么父...解决办法是父进程用waitpid来等待子进程信号。。。wait1.1 简介wait函数所需头文件:#include #include wait函数原型:pid_...
  • 6进程原语:wait()和waitpid()函数

    千次阅读 2014-09-20 23:41:59
    1 wait/waitpid 僵尸进程: 子进程退出,父进程没有回收子进程资源(PCB),则子进程变成僵尸进程 孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为1号 进程init进程,称为init...
  • 那就是,在编写程序的过程中,可以先不写头文件,编写完成后,用gcc的-Wall参数来编译。如果一个函数没有相应的头文件,一般会提示:  waitpid.c:17:warning:implicit declaration offunction `sleep'  ...
  • wait()函数,waitpid()函数

    2016-03-14 10:01:40
    头文件:#include #include 函数原型:pid_t wait(int *statloc); pid_t waitpid(pid_t pid,int *statloc,int options); 函数说明:wait函数使父进程暂停执行,直到它的一个子进程结束为止,该函数的返回值是终止运行...
  • wait与waitpid()的使用 更新记录 2017/10/18:写完初稿 waitpid()函数:中断(结束)进程函数使用场景希望知道某一个自己创建的子进程何时结束,从而方便父进程做一些处理动作。头文件与函数原型 头文件:#include ...
  • C wait()和waitpid()

    2016-12-25 21:42:59
    当前进程一旦调用了wait函数,就立即阻塞当前进程,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集...相关函数 waitpid,fork 需要头文件 #include
  • 转载--wait waitpid解释

    2015-01-14 00:09:00
    链接:wait、waitpid wait1.1 简介 wait函数所需头文件:#include <sys/types.h>#include <sys/wait.h>wait函数原型:pid_t wait(int *status);进程一旦调用了 wait,就立即阻塞自己,由wait自动分析...
  • wait函数和waitpid函数比较 wait  1.1 简介  wait函数所需头文件:  #include #include wait函数原型: pid_t wait(int *status); 进程一旦调用了 wait,就立即阻塞自己,由wait自动分析是否当前...
  • wait() 与 waitpid()

    2018-05-21 19:35:10
    wait和waitpidwait函数调用该函数使进程阻塞,直到任一个子进程结束【SIGCHLD】或者是该进程接收到了一个信号为止。如果该进程没有子进程或者其子进程已经结束,wait函数会立即返回。头文件:#include&lt;sys/...
  • Linux wait和waitpid和kill

    2019-09-16 07:41:30
    1. Linux wait 1) 功能:等待子进程中断或结束 2) 头文件 #include<sys/types.h> #include<sys/wait.h> 3) 函数定义: pid_t wait (int * status); 4) 函数说...
  • 头文件 #include #include 定义函数pid_t waitpid(pid_t pid, int * status,int options) waitpid()会暂时停止目前进程的执行,知道有信号来到或子进程结束。若果在调用wait()时子进程已经结束,则wait()...
  • 目录说在前面数据类型说明基本说明wait与waitpid区别 说在前面 环境: WSL、ubuntu16 参考: UNIX网络编程、linux manual page 目录:这里 数据类型说明 数据类型 说明 头文件 pid_t 一般为int,...
  • 头文件: #include <sys> #include 定义函数: pid_t wait (int * status); 函数说明:wait()会暂时停止目前进程的执行, 直到有信号来到或子进程结束. 如果在调用wait()时子进程已经结束, 则wait()会立即返回子...
  • 当前进程一旦调用了wait函数,就立即阻塞当前进程,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会...相关函数 waitpid,fork 需要头文件 #include #i
  • 进程等待的方法有wait方法和waitpid方法。 这里了解一下函数的使用,头文件包含以及函数原型,以及返回值等等。 wait函数 #include<sys/types.h> #include<sys/wait.h> pid_t wait(int *status); //该...
  • 图控大叔构图传递思想阅读从未如此简单!!!01前言 在进程的开发中,我们常常需要创建子进程来实现进程的“分身”,但是子进程执行完任务...02函数讲解wait()函数说明wait函数需要包含头文件#include#include函数...

空空如也

空空如也

1 2 3 4
收藏数 79
精华内容 31
关键字:

waitpid头文件