1、孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作
为了释放子进程的占用的系统资源:
进程结束之后,能够释放用户区空间
释放不了PCB,必须由父进程释放
- 父进程先运行,直接打印,然后立刻退出
- 子进程 sleep (1),等 1 秒后才打印
- 子进程打印时,父进程已经死了 → 子进程变成孤儿进程,被系统领养

父进程先运行,直接打印,然后立刻退出
子进程 sleep (1),等 1 秒后才打印
子进程打印时,父进程已经死了 → 子进程变成孤儿进程,被系统领养
2、僵尸进程
是一个已经死掉了的进程
一个比较特殊的状态,当进程退出父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会在以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
pid_t pid;
pid = fork();
if(pid == 0)
{
printf("child process pid id %d ppid = %d\n",getpid(),getppid());
}
else if(pid >0)
{
while(1)
{
sleep(1);
printf("parent process pid id %d ppid = %d\n",getpid(),getppid());
}
}
return 0;
}



父进程死循环,永远不退出
子进程打印一次,直接退出
子进程的父进程一直活着 → 子进程不是孤儿!PPID 就是父进程 PID
父进程每隔 1 秒打印一次自己
孤儿进程:
父死,子活着 → 被系统领养
僵尸进程:
父活着,子死了 → 父不收尸 → 子变僵尸