首先我们来了解一下僵尸进程
僵尸进程就是两个进程,一个父进程,一个子进程,其子进程终止后,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)宏确定返回值是否对应与一个暂停子进程。