1. 程式人生 > >Linux 殭屍程序與孤兒程序

Linux 殭屍程序與孤兒程序

殭屍程序
產生原因
子程序先於父程序退出,他要保留退出原因在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序,子程序退出了,去獲取一下原因,然後完全釋放子程序資源,假如父程序不管子程序的退出狀態,那麼這個子程序將進入僵死狀態,成為殭屍程序

程式碼實現殭屍程序
//該程式為20秒的殭屍程序,在第10秒時變為殭屍程序,30秒時退出

  #include <stdio.h>
  #include <unistd.h>
  #include <errno.h>
  #include <stdlib.h>
  
  int main()
  {
     pid_t pid = fork();//建立子程序
  
     if (pid < 0)//fork返回值小於零時是創建出錯
     {
         perror("fork error");
         return -1;
     }
     else if(pid == 0)//fork返回值為零時,是在子程序中
     {
         printf("this is child!!\n");
         sleep(10);
         exit(EXIT_SUCCESS);
     }
     else//在父程序中,fork的返回值是創建出的子程序的pid
     {
         printf("this is parent!!\n");
         sleep(20);
     }
 
     return 0;
 }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
此圖是在程式執行10秒內的程序資訊,可以看出父子程序此時都是S狀態,也就是睡眠態

此圖是程式執行10秒後到20秒內的程序資訊,此時的父程序還是睡眠狀態,而子程序已經變為殭屍態,此時的父程序就是殭屍程序

孤兒程序
產生原因
父程序先於子程序退出

此時父程序變為init程序,也就是說,父程序退出了,init程序將負責釋放資源,init程序非常負責任,因此,孤兒程序不會成為殭屍程序

程式碼實現
  #include <stdio.h>
  #include <unistd.h>
  #include <errno.h>
  
  int main()
  {
      pid_t pid = fork();
  
      if (pid < 0)
      {
          perror("fork error");
          return -1;
      }
      else if (pid > 0)
      {
          printf("parent %d\n", getpid());
          return 0;
      }
      else
      {
            sleep(30);
      }
     
      return 0;
  }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

此圖為10秒前,此時未成為孤兒程序,父程序pid為4764,子程序pid為4765

從上圖中可以看出父程序已經退出了,pid為4765的程序其父程序的pid為1,也就是其父程序變為init程序,此時已經成為孤兒程序,最終init程序在子程序結束後將負責釋放其資源
--------------------- 
作者:K_A_Irving 
來源:CSDN 
原文:https://blog.csdn.net/K_A_Irving/article/details/83792697 
版權宣告:本文為博主原創文章,轉載請附上博文連結!