环境:Vmware Workstation;CentOS-6.4-x86_64
说明:
1、僵死进程:子进程死亡,父进程存在。
2、子进程不会被回收,回收的时机是父进程退出;也就是说,僵死进程的子进程,只有父进程退出的时候才会被回收。
下面的程序是实现僵死进程的一个例子:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *args[])
{
// 执行fork并获取返回值
pid_t id = fork();
// 判断fork是否成功
// 当返回值为-1时,说明fork失败
if (id == -1)
{
printf("fork failed : %s", strerror(errno));
}
if (id > 0)
{
// 父进程休眠20秒
sleep(20);
}
else
{
// 子进程立即退出
exit(0);
}
return 0;
}
编译并执行程序:
[negivup@negivup mycode]$ gcc -o main main.c
[negivup@negivup mycode]$ main
程序还在执行,没有退出的时候,打开一个新的终端,查看僵死进程的状态
另一个终端:
[negivup@negivup ~]$ ps -aux
negivup 15025 0.0 0.0 3916 340 pts/1 S+ 18:16 0:00 main 这是僵死进程
negivup 15026 0.0 0.0 0 0 pts/1 Z+ 18:16 0:00 [main] <defunct> 这是等待回收的子进程,defunct意思“死的”
这个死的进程,只有在父进程消亡的时候才会被回收。
PS:根据传智播客视频学习整理得出。