有人能帮我一把,不一定能完成我的功课。
我需要使用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 %ldn",i,(long)getpID(),(long)getppID()); if (childpID==0) { break; } } if (childpID==0) { break; } } sleep(1); }
我对C编程非常陌生,一般来说编程很好,所以我想问问大众我错过了哪些步骤。 树深度需要用户指定,所以我想我会使用na循环,但只能跨越一个级别而不是创造新的水平。
有人可以帮助我,并指出我在正确的方向:)我需要它像这样叉
如何通过每次分派新的subprocess多次运行同一个jar文件?
为什么fork()和printf()的输出比我预测的要多?
在windows上用PHP分叉
printf(“%d”,i ++)与i ++之间有什么区别; 的printf(“%d”,i)的?
使用VirtualProtect将页面标记为copy-on-write(穷人在windows上分叉)
i / / / / / ii / / / / iiii / / / / iiiiiiii
我怎样才能从windows上的Perl CGI脚本分叉后台进程?
如何保持同一个核心上的父母和子女的过程
防止fork()复制套接字
os.fork()会在写入时使用copy还是在Python中完成父进程的完整副本?
我的文件服务器程序已经停止僵尸进程
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 %dn",(int)getpID()); exit(1); } return pID; } int main(voID) { fprintf(stderr,"Start %dn",(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 %dn",(int)getpID(),(int)getppID()); while (wait(0) > 0) ; fprintf(stderr,"Exit %dn",(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,(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,(int)getppID()); while (wait(0) > 0) ; printf("Exit %dn",(int)getpID()); } } int main(voID) { printf("Start %dn",(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,(int)getpID()); if (fork() < 0 || fork() < 0 || fork() < 0 || fork() < 0) { fprintf(stderr,(int)getpID()); exit(1); } fprintf(stderr,(int)getpID()); return(0); }
总结以上是内存溢出为你收集整理的如何创buildunix进程二叉树?全部内容,希望文章能够帮你解决如何创buildunix进程二叉树?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)