wait函数和waitpid函数介绍和使用

wait函数

父进程调用wait 函数可以回收子进程终止信息。该函数有三个功能:

① 阻塞等待子进程退出
② 回收子进程残留资源
③ 获取子进程结束状态(退出原因)。

pid_t wait(int *status); 成功:清理掉的子进程 ID;失败:-1 (没有子进程)
当进程终止时,操作系统的隐式回收机制会:1.关闭所有文件描述符 2. 释放用户空间分配的内存。内核的 PCB 仍存在。其中保存该进程的退出状态。(正常终止→退出值;异常终止→终止信号) 1. WIFEXITED(status) 为非0 → 进程正常结束。

常用相关函数:

  1. WIFEXITED(status) 为非0 → 进程正常结束
    WEXITSTATUS(status) 如上宏为真,使用此宏 → 获取进程退出状态 (exit 的参数)
  2. WIFSIGNALED(status) 为非0 → 进程异常终止
    WTERMSIG(status) 如上宏为真,使用此宏 → 取得使进程终止的那个信号的编号。

waitpid函数

作用同wait,但可指定 pid 进程清理,可以不阻塞。

pid_t waitpid(pid_t pid, int *status, in options); 成功:返回清理掉的子进程 ID;失败:-1(无子进程)

参数

  • pid:
    • 大于0 回收指定ID 的子进程
    • -1 回收任意子进程(相当于wait)
    • 0 回收和当前调用waitpid 一个组的所有子进程
    • < -1 回收指定进程组内的任意子进程
  • status:(传出)回收进程的状态
  • options:WNOHANG指定回收方式为:非阻塞。为0,则阻塞。

返回值:

  • 如果>0表示回收的子进程的pid
  • -1 回收失败。会设置errno
  • 0 参3 为 WNOHANG,且子进程正在运行,回收不成功。
wpid = waitpid(-1, NULL, WNOHANG);//回收任意子进程,若没有结束的子进程,父进程直接返回0
wpid = waitpid(pid, NULL, WNOHANG);//回收指定的一个子进程

wait、waitpid 依次调用只回收一个子进程,如果想回收多个子进程,需要用循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值