2014-03-05 61 views
1

我一直在這個問題上停留了好幾天。我必須使用fork()函數編寫以下樹結構。有什麼建議麼?這是我到目前爲止有:在C中使用分叉製作樹形結構

代碼:

#include <stdio.h> 
    #include <stdlib.h> 
    main() 
    { 
    int pid; 
    pid = fork(); 
    //Child 
    if (pid == 0){ 
    if ((pid = fork()) == 0) 
    { 
    printf("GrandChild: child pid = % d, my pid = %d, parent pid = %d \n", 
         pid, getpid(), getppid()); 
    } 
    } 
    exit(0); } 

樹型結構:

  A 
    B   C 
D   E F 
+0

你到目前爲止設法編寫了什麼? – this

+0

對不起,我很匆忙。我現在添加了代碼。 – user3369362

+0

請花時間並正確設置您的代碼的格式。 –

回答

0

下面的代碼應該創建所需的樹形結構。每個進程叉及其子女,運行一些需要的代碼,然後等待任何/所有子進程完成運行:

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

#define printPID printf("my pid = %d, parent pid = %d\n", getpid(), getppid()); 

void fork_error() { 
    perror("Failed to fork."); 
    exit(1); 
} 

void fork_child(void (*f)()) { 
    int pid; 
    if ((pid = fork()) == 0) { 
    f(); 
    wait(NULL); 
    exit(0); 
    } else if (pid < 0) { 
    fork_error(); 
    } 
} 

/* Function prototypes */ 
void A(), B(), C(), D(), E(), F(); 

void A() { 
    fork_child(B); 
    fork_child(C); 
    /* Code for A goes here */ 
    printPID; 
    wait(NULL); 
} 

void E() { 
    /* Code for E goes here */ 
    printPID; 
} 

void F() { 
    /* Code for F goes here */ 
    printPID; 
} 

void C() { 
    fork_child(E); 
    fork_child(F); 
    /* Code for C goes here */ 
    printPID; 
} 

void D() { 
    /* Code for D goes here */ 
    printPID; 
} 

void B() { 
    fork_child(D); 
    /* Code for B goes here */ 
    printPID; 
} 

int main(int argc, char *argv[]) { 
    A(); 
    return 0; 
} 

輸出示例:

$ ./a.out 
my pid = 17365, parent pid = 14178 
my pid = 17366, parent pid = 17365 
my pid = 17369, parent pid = 17367 
my pid = 17368, parent pid = 17366 
my pid = 17367, parent pid = 17365 
my pid = 17370, parent pid = 17367 

如果您還需要在每一個孩子的PID節點/進程,然後fork_child()返回一個包含子PID的int值。