一、僵尸进程&孤儿进程
1、僵尸进程
当进程退出并且⽗父进程(使⽤用wait()系统调⽤用)没有读取到⼦子进程退出的返回代码时就会产⽣生僵尸进程;僵尸进程会在以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。
2、孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
二、模拟实现僵尸进程和孤儿进程
(1)实现一个子进程维持20秒僵尸进程的代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<sys/types.h>
5
6 int main(void)
7 {
8 pid_t id=fork();
9 if(id<0)
10 {
11 perror("fork");
12 }
13 else if(id==0)
14 {
15 //parent
16 printf("Hi!I'm father!\n");
17 exit(0);
18 }
19 else
20 {
21 // printf("child[%d] is begin ...\n",getpid());
22 sleep(20);
23 wait(NULL);
24 }
25 }
编译结束出现的结果如下:
2、孤儿进程
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<sys/types.h>
5
6 int main()
7 {
8 pid_t id=fork();
9 if(id<0)
10 {
11 perror("fork");
12 return 1;
13 }
14 else if(id==0)
15 {//child
16 printf("I'm child,pid: %d\n",getpid());
17 sleep(10);
18 }
19 else{//parent
20 printf("I'm parent,pid: %d\n",getpid());
21 sleep(3);
22 exit(0);
23 }
24 return 0;
25 }
编译运行结果: