进程等待 - 11GX
首页 > 进程等待

进程等待

进程等待于原因

一个进程虽然退出了,但是该进程还保留了很多对于程序员或者系统管理员来说有用 的信息。比如,该进程识如何退出的,是正常退出,还是出现了错误,还是被其他进程结束掉,总结来说这个进程的退出码是什么;这个进程占用的CPU时间还有用户时间是多少。

这个时候为了回收这些信息我们就需要父进程调用进程等待函数来进程 信息的一些回收工作,如果一个进程退出了但是一直没有父进程回收它,这个进程就变成了僵尸进程,又名僵死进程。

父进程调用等待函数会发生的情况
  • 如果其所有子进程都还在运行,则父进程阻塞;可以这样理解,我们只有一个CUP,这个时候如果其他的子进程在运行的话,我们就没有其他的时间和精力去处理这个已经死亡的进程,所以这个时候父进程会一直阻塞住
  • 如果一个子进程已经死亡,正在等待父进程回收其终止状态,则这个时候父进程调用等待函数,并立即返回
  • 如果没有任何子进程终止,父进程依然调用了等待函数,则这个时候直接出错返回
进程等待函数

包含头文件

#include
#include
  • wait函数

     pid_t wait(int*status);

     返回值:成功则返回等待进程的PID,失败则返回-1

     参数:这个status可以是我们之前已经定义的一个int status;我们通过下面即将介绍的一个宏函数,然后把status传入进去可以获取退出状态;如果我们不关心这个退出状态的话,我们可以给这个参数填写上NULL
  • waitpid

     pid_t waitpid(pid_t pid, int *status, int options

     返回值:

    1. 当正常返回的时候waitpid返回收集到的子进程的进程ID;
    2. 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,

      则返回0;
    3. 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
    4. 当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就

      会出错返回,这时errno被设置为ECHILD.

      参数:

    1. pid:

      pid=-1,等待任一个子进程。与wait等效。

      Pid>0.等待其进程ID与pid相等的子进程。

      Pid==0等待其组ID等于调用进程组ID的任一个子进程。

      Pid<-1等待其组ID等于pid绝对值的任一子进程。

      (这个时候我们可以在waitpid这个函数的第一个参数中填写如相应的数字,比如-1,这个时候就可以等待任意的一个进程;如果我们填写 的是一个大于0的一个数字,一般这个数字就是一个进程号,就是某一个特定的进程,我们就可以等待这个特定的进程;其他的一个参数设置类似)
    2. status:

      WIFEXITED(status) :

      若为正常终止子进程返回的状态(这里就是一个返回状态),则为真。 (查看进程是

      否是正常退出)

      WEXITSTATUS(status) :

      若WIFEXITED非零,提取子进程退出码。(查看进程

      的退出码)
    3. options:

      WNOHANG :若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。

      若正常结束,则返回该子进程的ID。
程序实例讲解

进程的阻塞等待方式

#include
#include
#include
#include
#include
int main()
{pid_t sunpid = fork();if(sunpid < 0){printf("fork error
");}else if(sunpid == 0)   //子进程{printf("i am sun
");//sleep(10);printf("i will exit. my pid is %d
",getpid());sleep(10);exit(9);  //我刚刚测试这个代码的时候,一直是等待失败,可能 和我这个exit有关,我不用这个了,直接什么都不用,看看是什么效果}else  //父进程{int status;pid_t sun;//这里调用的是阻塞式等待,所以预期的结果是子进程打印出了i am sun之后五秒中之后,子进程打印i will exit ...然后父进程打印子进程的id,等待成功while(1){sleep(10);sun = wait(&status);  //如果等待成功了返回等待进程的pid,如果失败则返回-1if(sun == -1){printf("等待失败
");sleep(1);}else{printf("等待成功,子进程id是%d
",sun);printf("返回码为%d
",WEXITSTATUS(status));printf("返回状态为%d
",WIFEXITED(status));break;}}}return 0;
}

更多相关:

  • 在我们面试过程中,面试官经常会问到这么一个问题,那就是从在浏览器地址栏中输入URL到页面显示,浏览器到底发生了什么?这个问题看起来是老生常谈,但是这个问题回答的好坏,确实可以很好的反映出面试者知识的广度和深度。本文从浏览器角度来告诉你,URL后输入后按回车,浏览器内部究竟发生了什么,读完本文后,你将了解到:浏览器内有哪些进程,这些...

  • 进程与线程进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位[1]。比如,打开一个word文件就是启动了一个word进程。线程(thread)是进程内的子任务。比如word中可以进行编辑、拼写检查和打印等子任务。我们目前的操作系统都是多任务的操作系统,多任务的实现方式[2]:多进程多线程多进程 + 多线程多进程:...

  • 运行cmd netstat -aon|findstr 80 然后 taskkill -f -pid 32428(这个就是pid进程编号) 回车   进程死翘翘了~ 去愉快玩耍吧~哦对了 别忘记一健三联关注我哟~...

  • 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网...

  • 1.      SIGTERM “kill pid” 会发送SIGTERM到进程pid. This is the termination signal sent by killcommand by default. 2.      SIGINT 在终端中敲入interrupt key(DELETE或ctrl+c)会产生SIG...

  • empty()函数 是用来测试变量是否已经配置。若变量已存在、非空字符串或者非零,则返回 false 值;反之返回 true值。所以,当字符串的值为0时,也返回true,就是执行empty内部的语句。这就是陷阱。     如: 假设 $value = 0; 则empty($value)=false。     劝告各位,千万注意使用...

  • (四)Asp.net web api中的坑-【api的返回值】 原文:(四)Asp.net web api中的坑-【api的返回值】void无返回值IHttpActionResultHttpResponseMessage自定义类型我这里并不想赘述这些返回类型, 可以参考博文http://blog.csdn.net/leonk...

  • 今天碰见个题目,感觉短路表达式很好用。 题目: 定义一个计算圆面积的函数area_of_circle(),它有两个参数:r: 表示圆的半径;pi: 表示π的值,如果不传,则默认3.14function area_of_circle(r, pi) {} 我的写法:  if(arguments.length>=2) { ret...

  • 类型 JavaScript 有七种内置类型:null、undefined、boolean、number、string、object 和symbol,可以使用typeof 运算符来查看typeof返回的都是字符串很多开发人员将undefined 和undeclared 混为一谈, 但在JavaScript 中它们是两码事。undefin...

  • 什么是DOM document object model 的简称,意思为文档对象模型。主要用来对文档中的html节点进行操作。 Dom的操作简单示例:

    -->