Linux 学习笔记(六):wait() 系统调用

一、wait() 介绍

       有时候我们需要让一个进程等待另一个进程(最常见的是父进程等待自己的子进程,或者父进程回收自己的子进程资源包括僵尸进程),就需要使用到系统调用函数—— wait() 。对 wait 的调用会阻塞调用进程,直到它的一个子进程退出接收到信号。而子进程终止后,父进程将继续执行 wait() 系统调用之后的指令。

       简单来说,父进程执行 wait 函数之后,会被阻塞在此处。如果子进程状态发生变化,wait 函数会立即返回结果;否则 wait 函数会一直阻塞父进程,直到子进程状态发生变化。

       wait()阻塞的方式等待子进程退出,防止僵尸进程的产生。

  • 当父进程忘了使用 wait() 函数等待已终止的子进程时,子进程就会进入一种无父进程的状态,此时子进程就是僵尸进程
  • 如果父进程有多个子进程,只要有一个子进程终止,父进程就可以结束等待状态

二、wait 函数原型

int wait(int *status)
  • 参数 status 用来保存被收集进程退出时的一些状态,是一个指向 int 类型的指针

       ① 如果我们对这个子进程是如何死掉并不在意,只想把这个僵尸进程消灭掉,就可以设定这个参数为 NULL

pid = wait(NULL);

       如果成功,wait 会返回被收集的子进程的进程ID。如果调用进程没有子进程,调用就会失败,此时 wait 返回 -1,同时 errno 被置为 ECHILD 。

       ② 如果参数 status 的值不是NULL,wait 就会把子进程退出时的状态取出并存入 status 中, 这是一个整数值(int),指出了子进程是正常退出还是被非正常结束的,以及正常结束时的返回值,或被哪一个信号结束的等信息。

三、wait 返回值

       在有多个子程序的情况下,如果只终止了一个子进程,则返回该终止的子进程ID;如果终止了多个子进程,则 wait() 将获取任意的已终止子进程并返回该子进程的ID。

返回值 含义
-1 调用出错,此时出错信息在 errno 中
0 waitpid 的 options 设置了 WNOHANG,且调用中没有子进程退出
>0 返回结束子进程的 PID

四、总结

       wait() 会暂时停止当前进程的执行,直到有信号来到或子进程结束。

       如果在调用 wait() 时子进程已经结束,则 wait() 会立即返回该子进程的结束状态值。子进程的结束状态值由参数 status 返回,子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数 status 可以设成 NULL

猜你喜欢

转载自blog.csdn.net/Amentos/article/details/130687904
今日推荐