【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 孤儿进程和僵死进程
孤儿进程:因为父进程先退出而导致一个子进程被init进程收养的进程为孤儿进程。即孤儿进程的父进程更改为了init进程,该进程在孤儿进程退出后回收它的内核空间资源。
孤儿进程示例代码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
pid_t pid;
if((pid=fork())==-1)
perror("fork");
else if(pid==0)
{
printf("pid=%d,ppid=%d\n",getpid(),getppid());
sleep(2);
printf("pid=%d,ppid=%d\n",getpid(),getppid());
}
else
{
sleep(1);
exit(0);
}
}
运行结果:
$ ./a.out
pid=8283,ppid=8282
pid=8283,ppid=1
僵死进程:进程已退出,但它的父进程还没有回收其内核资源的进程为僵死进程,即该进程在内核空间的PCB没有释放。
僵死进程示例代码:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
if((pid=fork())==-1)
perror("fork");
else if(pid==0)
{
printf("child_pid pid=%d\n",getpid());
exit(0);
}
sleep(3);
system("ps");
exit(0);
}
运行结果:
$ ./a.out
child_pid pid=8314
PID TTY TIME CMD
3363 pts/1 00:00:06 bash
8313 pts/1 00:00:00 a.out
8314 pts/1 00:00:00 a.out <defunct>
8315 pts/1 00:00:00 sh
8316 pts/1 00:00:00 ps