一、僵尸进程介绍
- 在多进程开发的程序中,主进程要跟踪子进程的退出状态,当子进程运行结束时,内核不会立刻释放子进程进程表表项,而是等主进程读取子进程退出信息之后,才释放子进程的进程表表项。即父进程读取子进程退出信息之前,子进程结束之后,称该子进程为僵尸态。
- 另外一种情况是当夫进程异常退出或者结束,os将子进程的PPID设置为1,即init进程,子进程的结束由init进程接管,这种情况下,父进程退出之后,子进程退出之前,该子进程称为僵尸态。
二、如何避免僵尸态
如果子进程处于僵尸态,内核资源将是极大的浪费,因此尽快结束僵尸态是非常重要。
方法:父进程调用函数,函数等待子进程结束,获取子进程的返回信息。
pid_t waitpid(pid_t pid, int* stat_loc,int options);
- 此函数返回结束运行的子进程PID,并将子进程退出状态信息存储在stat_loc指向的内存中,options可以控制该函数的行为,比较常用的是将options设置为WNOHANG,即waitpid函数的调用是非阻塞的。
- 非阻塞的含义是pid指定的子进程没有结束,立即就返回0,正常退出了就返回海子进程的PID。在事件已经发生了,非阻塞才是有效率的,因此最后的情况是,子进程结束之后(事件发生),调用waitpid函数。
- 那么父进程怎么得知子进程退出了呢?
当一个进程结束,它将发生一个SIGCHLD信号,父进程将捕获SIGCHLD信号,并在信号处理函数中调用waitpid函数结束子进程。