1. 程式人生 > >殭屍程序,孤兒程序及程式碼實現

殭屍程序,孤兒程序及程式碼實現

殭屍程序

父程序呼叫fork()建立子程序,通常情況下,子程序執行時,父程序呼叫wait()或waitpid()函式等待子程序,子程序退出後,父程序接收到子程序的退出碼,並釋放子程序資源。 但如果父程序沒有接收到子程序的退出碼,那子程序的資源便無法回收,子程序將會以終止狀態保持在程序表中,直到父程序讀取它的退出碼,這種子程序也就叫殭屍程序。

殭屍程序的危害

1.殭屍程序雖然已經不再工作,但它自己那部分資源卻未得到釋放,會造成記憶體洩漏 2.計算機能夠執行的程序是有限的,殭屍程序過多將導致新程序無法建立 3.殭屍程序一直保持退出狀態,這是需要task_struct維護的,有一定開銷。

模擬實現殭屍程序

//模擬一個持續30s的殭屍程序

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 
  5 
  6 int main()
  7 {
  8     pid_t pid = fork();//建立一個子程序
  9 
 10     if (pid<0)//建立子程序失敗
 11     {
 12         printf("create child process is failed!!\n");
 13     }
 14 
 15     else
if (pid >0)//父程序 16 { 17 printf("parent process is sleeping:%d\n",getpid()); 18 sleep(30); 19 } 20 else//子程序 21 { 22 printf("this is child process"); 23 sleep(5); 24 exit(EXIT_SUCCESS); 25 } 26 return 0; 27 28 }

執行上面的程式碼,我們用ps -aux檢視一下程序的狀態: 這裡寫圖片描述

我們發現,這個pid為3415的程序就是我們所要的殭屍程序zombie。 再用kill -9試著強制終止該程序: 這裡寫圖片描述 連kill -9這樣的強制命令都無法終止殭屍程序,可見殭屍程序在計算機內是多麼頑固的存在。 正確處理殭屍程序的方法是呼叫wait()或者waitpid()函式,讓父程序及時接收到子程序返回的SIGCHID訊號並釋放資源。

孤兒程序

當父程序先於子程序退出,子程序就成為孤兒程序,子程序會被孤兒院init程序領養(意為init程序作為子程序的新父程序),由init程序為他回收資源。

程式碼實現

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 
  5 int main()
  6 {
  7     pid_t pid = fork(); //建立子程序
  8     if (pid < 0)//建立失敗
  9     {
 10         printf("fork error!!\n");
 11         return -1;
 12     }
 13     else if (pid >0)//父程序
 14     {
 15         printf("father is gone!!\n");
 16         exit(EXIT_SUCCESS);
 17     }
 18     else//子程序
 19     {
 20         printf("my father is gone!!  %d\n",getpid());
 21         sleep(20);
 22     }
 23     return 0;
 24 }

上述程式碼執行後,結果如下: 這裡寫圖片描述 我們再來看一下子程序的狀態: 這裡寫圖片描述 由圖可知,子程序已經被1號程序(init程序)領養,1號程序來為該程序釋放資源。