2014-09-25 67 views
5

我編寫了下面的程序,以瞭解在沒有wait()或waitpid()調用時fork的工作方式。Linux叉:pid重用

int main() 
{ 
    pid_t childpid; 
    int retval = 0; 
    int i; 
    while(1){ 
     //usleep(1); 
     childpid = fork(); 

     if (childpid >= 0) 
     { 
      i++; 
      if (childpid == 0) 
      { 
       exit(retval); 
      } 
      else 
      { 
       //printf("childpid is %d\n", childpid);      
      } 
     } 
     else 
     { 
      printf("total no. of processes created = %d\n", i); 
      perror("fork"); 
      exit(0); 
     } 
    } 
} 

這是我GET->

total no. of processes created = 64901 
fork: Cannot allocate memory 

我希望節目繼續下去,因爲我立即退出子進程和fork()的應該重用後PID>的PID_MAX的PID輸出。爲什麼不發生這種情況?

+0

我很驚訝你沒有完全崩潰你的系統。通常有一個用戶進程限制,以避免這種行爲和叉炸彈。 'ulimit -u'應該會給你的系統一個非常大的進程限制。這是你係統中的一個主要漏洞。 – 2014-09-25 12:09:30

+0

ulimit -u顯示:31488. 事實上,該程序甚至可以在後續嘗試中運行。 – Zaxter 2014-09-25 12:23:00

回答

7

退出的子進程確實作爲殭屍保留在進程表中。殭屍進程一直存在,直到父母呼叫waitwaitpid才能獲得退出狀態。同時,保留相應的進程ID,以防止其他新創建的進程複製它。

就你而言,進程表變得太大,系統拒絕創建新進程。

分叉過程,然後不檢索其退出狀態可以被視爲資源泄漏。當父母退出時,他們將被init過程所採納,然後獲得收益,但是如果父母長期存活,則系統無法僅刪除一些殭屍,因爲假定父母應該通過waitwaitpid在某些時間對它們產生興趣。

1

子進程還擁有一些資源,如內存。但是它們不會被釋放,因爲父進程不能處理SIGCHLD信號,它們在子進程退出時將被髮送。

那些子進程將成爲殭屍。

您可以使用「ps -aux」轉儲這些fd。