叉树C程序

问题描述:

我试图创建叉树图,但仍然没有成功。这里是我的代码:叉树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

您需要一种指定最大深度的方法,然后使用它来分叉新进程。一旦你完成分叉,你可以开始打印。下面的代码片段应该工作

#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); 
} 

代码会是这样,你应该叉两个子为每一个新的子进程,直到达到目标深度水平,分叉两个子后,父进程必须退出系统,只有新的子进程应该创建新进程,

你可以通过查看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