多线程 --- wait()、waitpid()函数

首先我们来了解一下僵尸进程

僵尸进程就是两个进程,一个父进程,一个子进程,其子进程终止后,0-3G的用户内存被回收,而3-4G的部分内存被回收,但是3-4G内存中的PCB等待父进程回收,若PCB未被父进程回收,我们称这个进程为僵尸进程。

注:之所以保留PCB,是因为其中保存着子进程的终止状态。而调用wait或waitpid获取子进程终止状态来对处已终止的子程序进行处理。

父进程回收子进程的资源所用到的函数有wait()和waitpid()函数
wait()函数

#include<sys/type.h>
#include<sys/wait.h>
wait(int* status);

wait()是一个阻塞函数,如果没有可以回收的子进程,则为阻塞状态;如果无子进程,则返回-1;如果回收成功,则返回子进程的pid。

waitpid()函数

#include<sys/type.h>
#include<sys/wait.h>
pid_t waitpid(pid_t pid,int * status,int options);

waitpid()是对wait()函数的优化,我们在父进程使用wait()函数时,因为这个函数是处于阻塞状态的,使父进程不能处理其他事情,这样便浪费了父进程的资源,所以我们引出了waitpid()非阻塞函数。

我们可以调用宏函数,来检查终止状态,可以辨别子进程是正常终止,还是由某个信号杀死,还是由作业控制停止。如果调用wait的进程,没有已终止子进程,那么wait将阻塞直到有一个子进程终止。waitpid函数给我们更多的控制,比如等待哪个进程,是否阻塞。

pid参数:

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

option参数:

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

option=WUNTRACED, 若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。WIFSTOPPED(status)宏确定返回值是否对应与一个暂停子进程。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whitemeen太白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值