Hi,您好,歡迎來到西安天任軟件科技有限責任公司!

Linux模拟實現(xiàn)僵屍進程

發布時間:2021-04-26 14:59:14


Linux模拟實現(xiàn)僵屍進程


Z(zombie)-僵屍進程

  1. 僵死狀态(Zombies) 是(shì)一個比較特殊的狀态。當進程退出并且父進程沒有讀取到子進程退出的返回代碼是(shì)就會産生僵屍進程。

  2. 僵屍進程會以終止狀态保存在進程表中,并且會一直等待父進程讀取退出狀态代碼。

  3. 所以,隻要子進程退出,父進程還在執行,但(dàn)父進程沒有讀取子進程狀态,子進程進入Z狀态

模拟實現(xiàn)僵屍進程

//模拟實現(xiàn)僵屍進程

int main()

{    

          pid_t pid;    

          pid = fork();    

          if(pid == -1)      

         {

                  perror("創建失敗");    

         }

          if(pid == 0)//孩子進程    

         {        

                 sleep(3);        

                 printf("孩子進程死亡\n");    

         }    

         else if(pid >0)//父進程    

         {        

                 int times = 10;        

                 while(times--)      

                {            

                      printf("父進程:%d\n",times);            

                      sleep(1);        

                }        

                printf("父進程死亡\n");    

          }    

          return 0;

}


測試結果


整個程序的調用過程如上,分别在1,2,3處調用了查看進程命令,1處表示程序正常執行,2處表示孩子進程已死亡,變成孤兒進程,3處表示父進程死亡并退出。

這是(shì)第一次查看進程的結果,紅色的方框表示本進程的PID,第一個黃色的方框表示父進程的PID,第二個黃色的框表示進程名,由圖可知(zhī),第二個進程的PID爲3340,他的父進程爲3339,恰好是(shì)第一個進程的PID,由此可知(zhī)第二個進程是(shì)第一個進程的子進程,這時父子進程同時在運行。

此時表示孩子進程已死亡,但(dàn)是(shì)父進程還在運行,子進程成爲僵屍進程

最後父進程退出,系統回收資源,并将子進程的資源同時回收,進程消失。

僵屍進程的産生

一個進程調用exit命令結束自己生命的時候,其實它并沒有真正的被銷毀,而是(shì)留下一個稱爲“僵屍進程”的數據結構。這時它已經放(fàng)棄了幾乎所有内存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置(它的内核棧還駐留在内存中),記載該進程的退出狀态等有用的信息供其它進程收集。進程的狀态變成EXIT_ZOMBIE,并且向父進程發送SIGCHLD信号,Linux默認是(shì)忽略該信号的,父進程可以顯示安裝該信号,在信号處理函數中調用wait或waitpid函數等待子進程結束并将其徹底清除。如果父進程沒有這麽做的話(huà),子進程就淪爲僵屍進程了。但(dàn)是(shì)在父進程死掉後,它的所有進程都會過繼給init進程,init進程會周期性的去(qù)調用wait系統調用來清除它的僵屍孩子。

僵屍進程的危害

少數的僵屍進程并不會對系統的性能有什麽影響,但(dàn)是(shì)由于Linux系統對運行的進程數量是(shì)有限制的,所以如果産生的僵屍進程過多,占用了可用的進程号,這将會導緻新的進程無法生成。


怎麽避免僵屍進程

(1)創建進程的時候調用兩次fork,而且使緊跟的子進程直接退出,這樣孫子進程成爲孤兒進程,init進程将負責清除這個孤兒進程。

(2)在Linux下可以簡單地将SIGCHLD信号的操作設爲SIG_IGN,這樣内核在子進程結束時不會産生僵屍進程。在SVR4中,如果調用signal或sigset将SIGCHLD的配置設置爲忽略,也不會産生僵屍進程。

(3)調用wait或waitpid等待子進程結束,收集僵屍進程留下的信息,同時使僵屍進程徹底消失。

(注:不能使用kill 後接SIGKILL信号這樣的命令像殺死普通進程一樣殺死僵屍進程,因爲僵屍進程是(shì)已經死掉的進程,它不能再接收任何信号。)

想要了解更多軟件相(xiàng)關知(zhī)識、提升自我,就來盛圖科技吧!

盛圖科技
高端IT培訓第一品牌



上一篇:軟件測試的基本問題
下一篇:OpenCV是(shì)什麽?