1、进程fork()后,子进程子承父业,继续运行与父进程一样的程序,但是子进程可以通过调用exec(),走向与父进程完全不同的道路(将新程序加载到旧程序的地址空间,丢弃旧的程序,进程的栈,数据段,堆栈被新程序替换)。
2、制作僵尸进程
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = fork();
if (pid < 0) {
printf("fork error.\n");
}else if (0 == pid) {
printf("child process.\n");
sleep(10);
exit(0);
}else {
printf("father process.\n");
sleep(20);
wait(NULL);
}
return 0;
}
3、通过ps查看进程状态
10秒后,子进程退出,但是还没等到父进程的wait函数做回收操作
子进程变成僵尸进程,状态是Z
4、进程一旦进入僵尸状态,立马变得刀枪不入,kill -9 也无能为力。僵尸独占这id号,task_struct,内核堆栈内存空间
5、那应该怎么结束僵尸进程,搬出英叔
5.1、父进程wait函数,完成收尸
5.2、结束父进程,init进程来收尸