2017-04-14 77 views
0

我試圖創建叉樹圖,但仍然沒有成功。這裏是我的代碼:叉樹C程序

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

void procStatus(int level) { 
    printf("L%d: PID[%d] (PPID[%d])\n", level, getpid(), getppid()); 
    fflush(NULL); 
} 

void levelFork(int *level) { 
    if (fork() == 0) 
     (*level)++; 
    wait(NULL); 
} 

void main() { 
    int level = 0; 
    procStatus(level); 
    levelFork(&level); 
    procStatus(level); 
} 

我想創建像下面這樣的畫面:

Fork Tree Diagram

這是輸出的樣子:

Output

任何幫助將是讚賞。

+0

我只有3行輸出,當我嘗試你的代碼。我還爲'wait()'和固定的'int main()'包含了缺失的庫。 – mch

回答

0

您需要一種指定最大深度的方法,然後使用它來分叉新進程。一旦你完成分叉,你可以開始打印。下面的代碼片段應該工作

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

void procStatus(int level) { 
    printf("L%d: PID[%d] (PPID[%d])\n", level, getpid(), getppid()); 
    fflush(NULL); 
} 

void levelFork(int *level,int maxlevel) { 
    int locallevel= *level; 
    while(locallevel!=maxlevel){ 
     int pid = fork(); 
     if (pid == 0){ 
     (*level)++; // childs level is higher 
     levelFork(level,maxlevel); 
     return; 
     } 
    locallevel++; 
    wait(NULL); 
    } 
} 

void main() { 
     int level = 0; 
     int maxlevel=3; 

     levelFork(&level,maxlevel); 
     procStatus(level); 
} 
1

代碼會是這樣,你應該叉兩個子爲每一個新的子進程,直到達到目標深度水平,分叉兩個子後,父進程必須退出系統,只有新的子進程應該創建新進程,

你可以通過查看childpid(叉的返回值)的代碼

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

int main(int argc, char *argv[]) 
{ 

pid_t childpid; 
int i, n; 
if (argc != 2) { 
    fprintf(stderr, "Usage: %s n\n", argv[0]); return 1; 
} 
n = atoi(argv[1]); 
childpid=-1; 
for (i = 1; i <= n; i++){ 

    int b; 
    for(b=0;b<2;b++) 
    { 
     childpid=fork(); 
     if (childpid <= 0) break; 

    } 
    if (childpid > 0) break; 

} 
while(wait(NULL) > 0) ; /* wait for all of your children */ 


fprintf(stderr, "i:%d process ID:%ld parent ID:%ld child ID:%ld\n",i, (long)getpid(), (long)getppid(), (long)childpid); 
return 0; 
} 

輸出丟棄的父進程是這樣​​的

└──╼ $./fork.o 2 
i:3 process ID:23913 parent ID:23911 child ID:0 
i:3 process ID:23915 parent ID:23911 child ID:0 
i:3 process ID:23914 parent ID:23912 child ID:0 
i:3 process ID:23916 parent ID:23912 child ID:0 
i:2 process ID:23911 parent ID:23910 child ID:23915 
i:2 process ID:23912 parent ID:23910 child ID:23916 
i:1 process ID:23910 parent ID:23277 child ID:23912