1. 程式人生 > >模擬實現殭屍程序,孤兒程序的場景

模擬實現殭屍程序,孤兒程序的場景

 

使用程式碼模擬實現殭屍程序, 孤兒程序的場景

殭屍程序:

1.殭屍狀態是一個比較特殊的狀態。當程序退出並且父程序沒有讀取到子程序退出的返回程式碼時就會產生殭屍程序

2.殭屍程序會以終止狀態保持在程序表中,並且會一直等待父程序讀取退出狀態程式碼

3.所以,只要子程序退出,父程序還在執行,但父程序沒有讀取子程序的狀態,子程序就進去殭屍狀態

程式碼實現 

#include<stdio.h>     
#include<stdlib.h>
#include<unistd.h>
 
 int main()
{
    pid_t pid = fork();
    if(pid < 0)
    { 
        perror("fork");                                                         
        return 1;
    }
    else if(pid > 0)
    {
        printf("parent : %d\n", getpid());
        sleep(30);
    }
    else
    {
        printf("child : %d\n",getpid());
        sleep(5);
    }   
}

​

殭屍程序的危害:

1.程序的退出狀態必須被維持下去,因為他要關心他的程序(父程序),父程序如果一直不讀取,那子程序一直處於Z狀態

2.維護退出狀態本身就是要用資料維護,也屬於程序的基本資訊,所以儲存在task_struct中,換句話說,Z狀態一直不退出,PCB就要

一直維護

3.父程序建立了很多子程序,就是不回收,就會造成記憶體資源的浪費,因為資料結構物件本身就要佔用記憶體。

4.記憶體洩露

孤兒程序

父程序先退出,子程序就稱之為“孤兒程序”

孤兒程序被1號init程序領養,當然要由init程序回收

使用程式碼模擬實現孤兒程序

程式碼實現

#include<stdio.h>                                                                                                                                           
#include<stdlib.h>                                                                                                                                          
#include<unistd.h>
int main()                                                                                                                                             
{                                                                                                                                                           
   pid_t id = fork();                                                                                                                                        
   if(id<0)                                                                                                                                                     
   {                                                                                                                                                         
     perror("fork");                                                                                                                                         
     return 1;                                                                                                                                               
   }                                                                                                                                                         
   else if(id==0)                                                                                                                                            
   {                                                                                                                                                         
     printf("child:%d\n",getpid());                                                                                                                          
     sleep(10);                                                                                                                                              
   }                                                                                                                                                         
   else
   {                                                                                                                                                                                                        
     printf("parent:%d\n",getpid());                                                                                                                         
     sleep(3);                                                                                                                                               
     exit(0);                                                                                                                                                
   }                                                                                                                                                         
   return 0;
}