2014-01-23 104 views
0

我是一名正在學習編程並正在創建和關閉進程的學生。我能夠創建這個程序,從Bash獲取參數,argv[1]是過程將創建的子項的數量。 argv[2]確定這些孩子中的哪一個創建了另一個孩子。現在我想讓argv[3]使這個子進程的數量(從argv[1])變成殭屍。我還必須以某種方式放置一個「故障安全」,以便孩子在成爲殭屍之前首先處理孫子。創建殭屍進程的煩惱

我已經成功地使前兩個參數有效。

的代碼是:

int main(int argc, char *argv[]) 
{ 
    int i, antal, grandchild; pid_t pid, pid2; 
    antal=atoi(argv[1]); 
    grandchild=atoi(argv[2]); 
    printf("antal=%d.\n grandchild=%d\n\n", antal,grandchild); 
    for(i=0; i<antal; i++) 
    { 
     pid=fork(); 
     switch(pid) 
     { 
      case -1: 
       fprintf(stderr, "Fork Failed!"); 
       break; 

      case 0: 
       printf("Child process: %d.\n", getpid()); 
       sleep(1); 
       if(i+1==grandchild) 
        pid2=fork(); 
        if(pid2==0) 
        { 
         printf("I am the grandchilde with PID: %d.\n",getpid()); 
         sleep(5); 
         exit(0); 
        } 
       wait(0); 
       exit(0); 
       break; 

      default: printf("Parent process with PID: %d\n", getpid()); 
       wait(0); 
       break; 

     } 
    } 
} 
我無法理解我怎麼能去這樣做

。我有6個月的課程,所以我沒有廣泛的編程技能。任何關於這個問題的幫助或提示非常感謝。我也非常感謝任何有這方面信息的網站。

也被認爲是讀取最友好的選項控制fork()返回值?

在此先感謝。

回答

1

所有的過程將成爲殭屍exit();一旦他們的父母程序wait()就會被移除。如果父進程死了,它們將被init進程繼承,除了在完成初始化系統之後,在循環中調用wait()之外,它基本上什麼都沒有做。所以,只要你的程序退出,你的殭屍將會很快被init初始化。一旦您的孩子退出(或撥打電話號碼wait(),就像您的計劃中一樣),您的孫子也不會再成爲殭屍了。

因此,要看到ps -a中的殭屍,您必須在程序結尾處放置一個類似sleep(1000)的東西,以防止其退出。

你的孩子,有孫子,也不應該wait()。嘗試類似

while (kill(pid, 0)!=-1) 
    sleep(1); 

等到進程已退出(與信號數0什麼也不做殺害所有,但如果進程不存在失敗,它可能會失敗,因爲其他原因,以及,但那些通常不適用於此)。

不是說你在這裏想要做什麼可以用於教育目的,但是如果你曾經在「真實」程序中嘗試過,unix守護進程會在你的睡眠中降臨到你的身上,並以你的方式纏住你,甚至不想考慮。

+0

我從未使用過kill()命令。因此,如果我理解正確,通過在子孫產卵的代碼中加入kill(pid,0)!= - 1,它會等待孫子成功退出? –

+0

「成功退出」?我從來沒有聽說過一個不成功的退出;-)但回答你的問題:kill(pid,0)只是檢測到該進程與該pid的存在。如果該進程存在(並且不是殭屍),則返回0;如果進程已終止,則返回-1。所以'kill'用來檢測進程是否仍在運行,'while .. sleep'等待進程不再運行。 –

+0

我試圖添加一段代碼而不是等待()在包含孫子的孩子,它只是讓程序凍結(我認爲它只是成爲一個殭屍)。 –

0

再說什麼貢特拉姆布洛姆寫道,你顯然已經忘記了括號的位置:

  if(i+1==grandchild) 
       pid2=fork(); 
       if(pid2==0) 
       { 
        printf("I am the grandchilde with PID: %d.\n",getpid()); 
        sleep(5); 
        exit(0); 
       } 

(用適當的選項一個好的編譯器會警告說,PID2可能會被初始化。)

你可能會寫

  if (i+1==grandchild) 
       if (fork()==0) 
       { 
        printf("I am the grandchilde with PID: %d.\n",getpid()); 
        sleep(5); 
        exit(0); 
       } 

改爲。