Linux 进程:辨析wait与waitpid
wait 与 waitpid 这两个函数的作用是:等待子进程退出,在子进程退出后释放子进程资源,防止子进程变成僵尸进程。但准确的说,它们的作用是:处理已经退出的子进程,并获取子进程的退出返回值。
来举个例子:如果wait或者waitpid函数是在程序运行的第10秒才会被执行到,但是在程序运行的第5秒就已经有子进程A退出了,你觉得当运行到wait或者waitpid函数的时候,会去处理子进程A吗?
答案是会的,因为准确的说它们的功能就是:处理已经退出的子进程,并获取子进程的退出返回值。
一、wait
pid_t wait(int *status);
作用:如果调用时还没有已经退出的子进程,那么将阻塞等待任意一个子进程退出。
- int *status:使用status参数作为输出参数获取子进程的退出返回值。
返回值:如果成功处理退出的子进程就返回子进程的pid,失败返回-1。
注意:因为这个函数是一种阻塞等待,当阻塞被打断时,意味着这个函数处理失败。
二、waitpid
pid_t waitpid(pid_t pid, int *status, int options);
作用:处理退出的子进程,但根据操作选项options的不同,也会分为不同的情况。
(1)参数:pid
pid | 含义 |
---|---|
-1 | 等待任意一个子进程 |
子进程pid | 等待该子进程 |
pid这个参数常用的两个选项:
- -1:代表着等待任意一个子进程退出,然后进行处理。
- 子进程pid:专门去等待这个pid对应的子进程退出,然后进行处理。
(2)参数:status
- int *status:输出参数,用于向外界返回退出子进程的返回值。
(3)参数:options
options | 含义 |
---|---|
WNOHANG | 如果运行这个函数时子进程没有退出,直接返回,不等待。 |
我们常用的就是这个选项:WNOHANG,表示当这个函数运行时如果没有子进程已经退出,就直接返回,并不阻塞等待。
(4)返回值
返回值共三种:
- 如果成功处理了退出的子进程:返回子进程pid
- 如果当前没有子进程退出:返回0
- 如果处理出错:返回-1