2017-09-26 90 views
0

我想創建一個進程樹,但這裏是我的輸出是:https://gyazo.com/a71f4e095b69080a6d6a11edd2c0df27 問題是我想使它看起來像我畫在右邊的圖,但可以似乎不知道如何。我正在打印每個子進程的父ID,然後這樣做後,我將從2開始刪除它們,然後是1(通過在5秒後發送SIGKILL信號)。 如何使流程樹看起來像所需的結果?這裏是我的代碼:C幫助創建一個進程樹

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 


int main() 
{ 
    int root, t1, t2, i; 

    root = getpid(); 
    printf("root %d\n", root); 
    for (i = 1; i < 3; i++) 
    { 
     t1 = fork(); 
     //printf("%d\n", t1); 
     if(t1!=0) 
     { 
     t2 = fork(); 
     } 
     if (t1 !=0 && t2 != 0) 
     { 
      break; 
     } 

     printf("child pid %d parent pid %d\n", getpid(), getppid()); 
    } 
    sleep(10); 

    return 0; 
} 

謝謝!

回答

0

您的主for循環運行在所有叉,它不符合您的圖。 你真正想要的是你的if語句具有相同的結構,你的樹:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 


int main() 
{ 
    printf("root %d\n", getpid()); 

    if (fork()) 
    { 
     fork(); 
    } else { 
     if (fork()) 
     { 
      if (fork()) 
      { 
       fork(); 
      } 
     } 
    } 

    printf("child pid %d parent pid %d\n", getpid(), getppid()); 

    fflush(stdout); 

    sleep(10); 

    return 0; 
} 

這給了期望的結果:

root 5140 
child pid 5140 parent pid 377 
child pid 5147 parent pid 5141 
child pid 5149 parent pid 5141 
child pid 5146 parent pid 5140 
child pid 5148 parent pid 5141 
child pid 5141 parent pid 5140 

NB。 sleep()是爲了確保沒有任何流程退出他們的子女,此時他們的子女將被重新設置爲ppid = 1(init)。

+0

如果我想從下往上刪除它們(所以刪除2的所有子進程然後殺掉1)我該怎麼做?我會用SIGKILL嗎?我嘗試過兩次運行SIGKILL,但它只打印「殺死」一次,然後退出程序,我不知道如何驗證它做了我想要的。 –