僵尸进程
当我刚开始接触接触僵尸进程和孤儿进程的时候,我一直搞不清楚二者到底是什么区别。我相信对于很多刚接触进程的学生来说是和我一样的,不理解僵尸进程和孤儿进程的概念。现在我就按照我的理解给大家简单的叙述一下,希望对大家能够有所帮助。
我理解的孤儿进程就是父进程死了之后所剩下的子进程。大家想象一下对于孤儿我们通常会怎么样?当然是送进孤儿院了,我们这里的1号进程,也就是大多数系统下的init进程,就相当于这个孤儿院的院长收养所有的孤儿进程。使得当他们结束时候能够得到正常的释放,不至于占用系统的内存等等。
那么僵尸进程又是什么呢?僵尸进程就相当于是一个父亲对自己的儿子的生死不管不顾,一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个进程完成它的工作终止之
看下面这个例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main()
{
pid_t pid;
//循环创建子进程
while (1)
{
pid = fork();
if (pid < 0)
{
perror(“fork error:”);
exit(1);
}
else if (pid == 0)
{
printf(“I am a child process.\nI am exiting.\n”);
//子进程退出,成为僵尸进程
exit(0);
}
else
{
//父进程休眠20s继续创建子进程
sleep(10);
//输出进程信息
system(“ps -o pid,ppid,state,tty,command”);
continue;
}
}
return 0;
}