2016-03-14 85 views
1

我是操作系統課程的助教,學生的任務是開發一個fork bomb defuser。作爲測試案例的一部分,我想開發一種看起來像叉炸彈的東西,但事實上它相當安全(即消除了許多進程,但這些進程已被刪除)。我的問題是,在我的OS X機器上進行測試時,我注意到如果將睡眠延遲設置得太低(〜100000)並且孩子數量太高(〜1000),它實際上會殺死我所有的用戶進程。當我說我的意思是Firefox,Xcode,Word,甚至Finder似乎都停止了。這對我來說似乎有點奇怪,因爲任務只有一個孩子,但我想知道OS X是否對用戶可以擁有的子進程數量有限制。我無法在Google上找到任何內容,但有任何建議。OS X殺死進程太快?

特別是: 1)這段代碼不合理,我錯過了一些明顯的原因,它應該被殺死? 2)OS X中是否有一些文檔可以解釋我們看到這種行爲的原因?

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    int i; 
    pid_t pid; 

    if(argc < 2) { 
     printf("Usage: fork_safe n\n"); 
     return 0; 
    } 

    int n = strtol(argv[1], NULL, 10); 

    for(i = 0; i < n; i++) { 
     pid = fork(); 
     if(pid == 0){ 
      break; 
     } else { 
      printf("child pid %d, killing...\n", pid); 
      usleep(10000); 
      kill(pid,SIGTERM); 
      fflush(stdout); 
     } 
    } 

    while(1); 
    return 0; 
} 
+0

這可能有助於問這個上[提出不同(http://apple.stackexchange.com/)。 –

回答

3

你是不是檢查從fork()錯誤的返回值。如果它返回-1,那麼您將傳遞-1到kill函數中。

而按照man page for the kill function

如果pid等於-1,那麼則發送sig到每爲其 調用進程有權限發送信號,除了處理1 (INIT)工藝,但見下文。

所以我懷疑fork失敗,因爲它不能分配更多的進程。因此,您的代碼正在向您的帳戶擁有的每個流程發送SIGTERM。這解釋了你所看到的行爲。

修改您的for循環相應:

for(i = 0; i < n; i++) 
{ 
    pid = fork(); 
    if(pid == 0) 
    { 
     break; 
    } 
    else if (pid == -1) 
    { 
     printf("Unable to allocate any more processes\n"); 
     return 0; 
    } 
    else 
    { 
     printf("child pid %d, killing...\n", pid); 
     usleep(10000); 
     kill(pid,SIGTERM); 
     fflush(stdout); 
    } 
} 
+0

哎呀,真不敢相信我沒有想到這一點,感謝您的快速回復!它看起來似乎是fork返回-1,並補充說catch可以解決這個問題。另外「ulimit -u」顯示709,這接近我得到的613。謝謝! – Christophe