僵尸进程(Zombie Process):进程已运行结束,但进程的占用的资源未被回收,这样的进程称为僵尸进程。
子进程已运行结束,父进程未调用wait或waitpid函数回收子进程的资源是子进程变为僵尸进程的原因。
如果一个父进程终止,而该进程有子进程处于僵尸状态,那么它的所有僵尸子进程的父进程ID将被重置为1(init进程)。继承这些子进程的init进程将清理它们(init进程将wait它们,从而去除僵尸状态)。
但通常情况下,我们是不愿意留存僵尸进程的,它们占用内核中的空间,最终可能导致我们耗尽进程资源,所以更好的做法是调用回收子进程资源函数,阻止僵尸进程的产生。
通过查看资料,可以调用wait或waitpid函数回收子进程的资源;因为直接在父进程中使用函数wait()、waitpid(pid,NULL,0)会导致父进程必须等待子进程结束才能执行,为了避免这种现象本人想到了采用waitpid(pid,NULL,WNOHANG)这种方式,下面是测试情况:
代码:
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/wait.h>
int main(void)
{
pid_tpid,ppid;
pid=fork();
if(pid< 0)
<