在每个进程退出的时候,内核释放该进程所有的资源、包括打开的文件、占用的内存等。但是仍然为其保留一定的信息,这些信息主要值进程控制块PCB的信息,包含自身进程号、父进程号、退出状态、运行时间等。
父进程可以通过调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。
wait()和waitpid()默认情况下都是堵塞等待,waitpid()可以设置不堵塞,还可以指定等待哪个子进程结束。一次wait或waitpid调用只能清理一个子进程,清理多个子进程应该使用循环。
wait函数
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
参数:
int *statue :用于获取子进程退出时的状态
返回值:
如果成功,返回被回收的子进程id;如果失败,返回-1 。
退出信息相关宏函数
WIFEXITED(status)非0,进程正常退出
WEXITSTATUS(status)获取进程退出的状态码(exit的参数)
WIFSIGNALED(status)非0,进程异常终止
WTERMSIG(status) 获取使进程终止的信号编号
WIFSTOPPED(status)非0,进程暂停
WSTOPSIG(status)获取使进程暂停的信号编号
WIFCONTINUED(status)非0,进程暂停后继续运行
例子如下。
int state;
int ret = wait(&state);
if(WIFEXITED(state)) {
//正常退出
printf("%d\n",WEXITSTATUS(status)); //获取状态码
}
if(WIFSIGNALED(state)) {
//异常终止
printf("%d\n",WTERMSIG(status)); //获取信号编号
}
if(WIFSTOPPED(state)){
//进程暂停
printf("%d\n",WSTOPSIG(status)); //获取信号编号
}
waitpid函数
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
参数:
pid_t pid:指定子进程
- 小于- 1 : 回收某个进程组的进程,进程组id为其绝对值
- -1 : 等待任何一个子进程
- 0 : 回收当前进程组的子进程
- 大于0 : 等待具体某个子进程
int *statue :用于获取子进程退出时的状态
options :0代表阻塞, WNOHANG代表非阻塞(不会挂起)
返回值:
如果成功,返回被回收的子进程id。
如果还有子进程存在,返回0。
如果失败(无子进程存在),返回-1 。