僵尸进程:
起因:子进程先于父进程退出,退出后为了保存自己的退出原因,因此资源没有被完全的释放,操作系统此时通知并且允许了父进程来接收这个返回值,但是如果父进程不管的话,这块资源就没有被完全的退出,处于僵死状态,称为僵尸进程
后果:资源泄露
#include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4
5
6 int main()
7 {
8 printf("**************%d\n",getpid());
9 pid_t pid = fork();//创建子进程
10 if(pid < 0)
11 {
12 printf("fork error\n");
13 return -1;
14 }
15 else if(pid == 0)
16 {
17 //这段代码只有子进程能够运行到,因为在子进程中fork返回0
18 printf("this is child!!--%d\n",getpid());
19 sleep(5);
20 exit(0);
21 }
22 else if(pid > 0)
23 {
24 //这段代码只有父进程才能运行到
25 printf("this is parent!---%d\n",getpid());
26 }
27 //下面的代码父子进程都有可能运行到
28 while(1)
29 {
30 printf("-----------%d\n",getpid());
31 sleep(1);
32 }
33
34 return 0;
35 }
执行了zombie.c的代码之后,再看此时的进程过一会就变成了僵尸进程
孤儿进程:
来由:与僵尸进程相反,父进程先于子进程退出,这时候子进程就变成了一个孤儿进程(进程由一个前台进程变成了一个后台的进程),并且被1号进程收养。
如果是前台进程的话,我们在前台将无法输入命令,但是如果变成孤儿进程的话,就会变成后台的进程,依然可以运行
#include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4
5 int main()
6 {
7 printf("*************\n");
8 pid_t pid = fork();
9 if(pid > 0)
10 {
11 sleep(5);
12 exit(0);
13
14 }
15 while(1)
16 {
17 printf("-----------\n");
18 sleep(1);
19 }
20
21 return 0;
22 }
下面就是孤儿进程的演示图:
前台依然可以输入命令,此时已经变成了后台的进程
这个时候,只能kill这个进程才可以退出
此时的父进程的pid变成了1,就是init进程