http://www.zyfforlinux.cc/2015/01/02/%E5%AD%90%E8%BF%9B%E7%A8%8B%E7%8A%B6%E6%80%81%E5%9B%9E%E6%94%B6/
wait和waitpid
在父子进程中,子进程执行结束后,如果不对其进行回收,那么子进程就会变成僵尸进程,
随着僵尸进程变多会占用大量的pid等资源所以需要使用wait或者waitpid对子进程进行回收。
下面是两个API函数的函数原型:
1
|
#include <sys/types.h>
|
wait是阻塞的,只要有子进程退出就回收,子进程退出的信息保存在status中(需要使用一些封装好的宏来提取status中的信息)
waitpid则功能更加强大:
pid == -1 等待任意子进程退出 此时和wait效果一样
pid > 0 等待进程ID和pid相同的进程
pid == 0 等待组ID等于调用进程组ID的任一子进程
pid < -1 等待组ID等于pid的绝对值的任意子进程
options常用的选项是WNOHANG,表示waitpid是非阻塞的。
这两个函数的一般应用场景都是放在信号处理函数中,当子进程结束的时候会发送SIGCHLD信号,
那么在SIGCHLD信号对应的处理函数中去调用wait或waitpid来实现对子进程的回收。
下面给出waitpid的用法:
1
|
static void handle_child(int sig)
|
子进程的状态获取
通过使用wait和waitpid可以得到子进程退出的状态status,但是还是需要使用一个宏来解析出退出的状态码或者其他信息
linux本身提供了一系列的宏可以帮助我们完成这个工作:
每一组宏都是对应的:
1
|
WIFEXITED(status) 如果子进程是正常退出的就返回true
|
下面是这组宏的常见用法:
1
|
#include <iostream>
|