如何创buildunix进程二叉树?

有人能帮我一把,不一定能完成我的功课。

我需要使用fork()创build一个进程树。 在Unix / C到目前为止最好的我可以到达第四级这里是我的代码:

/* Includes */ #include <unistd.h> /* Symbolic Constants */ #include <stdio.h> /* Input/Output */ #include <stdlib.h> /* General Utilities */ int main() { pid_t childpid; pid_t pid; int i; childpid=fork(); waitpid(); i=0; for (; i<1; i++) { int b=0; for (; b<1;b++) { childpid=fork(); fprintf(stderr,"the value of i is %d, i am %ld , my parent is %ld\n", i, (long)getpid(), (long)getppid()); if (childpid==0) { break; } } if (childpid==0) { break; } } sleep(1); } 

我对C编程非常陌生,一般来说编程很好,所以我想问问大众我错过了哪些步骤。 树深度需要用户指定,所以我想我会使用na循环,但只能跨越一个级别而不是创造新的水平。

有人可以帮助我,并指出我在正确的方向:)我需要它像这样叉

  i / \ / \ / \ / \ / \ ii / \ / \ / \ / \ iiii / \ / \ / \ / \ iiiiiiii 

waitpid()函数需要参数。

最初的childpid = fork(); 是意外的。

你可以明智地写:

 for (int i = 0; i < 1; i++) 

循环除非你坚持使用C89而不是C99语法。

尝试2

输出示例

 Start 46480 i am 46480, my parent is 30775 i am 46482, my parent is 46480 i am 46481, my parent is 46480 i am 46483, my parent is 46481 i am 46484, my parent is 46482 i am 46486, my parent is 46482 i am 46487, my parent is 46483 Exit 46487 i am 46488, my parent is 46484 Exit 46488 i am 46485, my parent is 46481 i am 46491, my parent is 46484 Exit 46491 i am 46489, my parent is 46483 Exit 46489 Exit 46483 i am 46492, my parent is 46486 Exit 46492 Exit 46484 i am 46490, my parent is 46486 Exit 46490 i am 46493, my parent is 46485 Exit 46493 Exit 46486 Exit 46482 i am 46494, my parent is 46485 Exit 46494 Exit 46485 Exit 46481 Exit 46480 

示例源

 #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> static pid_t fork_ok(void) { pid_t pid; if ((pid = fork()) < 0) { fprintf(stderr, "Fork failure in pid %d\n", (int)getpid()); exit(1); } return pid; } int main(void) { fprintf(stderr, "Start %d\n", (int)getpid()); for (int level = 0; level < 3; level++) { if (fork_ok() == 0 || fork_ok() == 0) continue; break; } fprintf(stderr, "i am %d, my parent is %d\n", (int)getpid(), (int)getppid()); while (wait(0) > 0) ; fprintf(stderr, "Exit %d\n", (int)getpid()); return(0); } 

这使用循环,有点不寻常的循环。 在每个级别上,父母的流程分派两个孩子; 孩子们各自“继续”到下一个等级,而父母完成并退出循环。 清理代码和以前一样(见下文)。

递归变体

 #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> static pid_t fork_ok(void) { pid_t pid; if ((pid = fork()) < 0) { fprintf(stderr, "Fork failure in pid %d\n", (int)getpid()); exit(1); } return pid; } static void new_level(int level) { if (level > 3) return; if (fork_ok() == 0 || fork_ok() == 0) new_level(level+1); else { printf("i am %d, my parent is %d\n", (int)getpid(), (int)getppid()); while (wait(0) > 0) ; printf("Exit %d\n", (int)getpid()); } } int main(void) { printf("Start %d\n", (int)getpid()); fflush(0); new_level(0); return(0); } 

尝试1

我不相信你需要任何循环。 这似乎是对我的伎俩:

输出示例

 Start 44397 i am 44397, my parent is 30775 i am 44400, my parent is 44397 i am 44401, my parent is 44397 Exit 44401 i am 44399, my parent is 44397 i am 44398, my parent is 44397 i am 44404, my parent is 44400 Exit 44404 i am 44403, my parent is 44399 i am 44402, my parent is 44398 i am 44405, my parent is 44398 i am 44407, my parent is 44398 Exit 44407 Exit 44400 i am 44406, my parent is 44399 Exit 44406 i am 44408, my parent is 44402 i am 44410, my parent is 44402 i am 44411, my parent is 44405 Exit 44410 Exit 44411 i am 44409, my parent is 44403 Exit 44409 Exit 44405 i am 44412, my parent is 44408 Exit 44412 Exit 44403 Exit 44399 Exit 44408 Exit 44402 Exit 44398 Exit 44397 

源代码

 #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> int main(void) { fprintf(stderr, "Start %d\n", (int)getpid()); if (fork() < 0 || fork() < 0 || fork() < 0 || fork() < 0) { fprintf(stderr, "Fork failure in pid %d\n", (int)getpid()); exit(1); } fprintf(stderr, "i am %d, my parent is %d\n", (int)getpid(), (int)getppid()); while (wait(0) > 0) ; fprintf(stderr, "Exit %d\n", (int)getpid()); return(0); }