在前面,我欣然承认这是功课。但是我一直把头撞在墙上,我就是不明白。赋值参数如下:“递归计算指定数。如果print为真,则打印。否则,提供给我的父进程。
注意:解决方案必须是递归的,并且必须为每个调用派生一个新的孩子。每个进程应该只调用doFib()
一次。”
这是我第一次使用 fork(),虽然我想我理解,但我无法理解为什么我没有得到正确答案。这是我的代码,相当简陋:
doFib(int n, int doPrint)
{
int status;
int print;
pid_t pid1;
pid_t pid2;
int sum1;
int sum2;
if (n < 2)
exit(n);
pid1 = fork();
if (pid1 == 0)
{
doFib(n-1, doPrint);
exit(n-1);
}
pid2 = fork();
if (pid2 == 0)
{
doFib(n-2, doPrint);
exit(n-2);
}
while ((pid1 = waitpid(-1,&status, 0)) >0)
{
if(WIFEXITED(status))
sum1 += WEXITSTATUS(status);
}
while ((pid2 = waitpid(-1,&status, 0)) >0)
{
if(WIFEXITED(status))
sum2 += WEXITSTATUS(status);
}
print = sum1 + sum2;
if(doPrint)
printf("%d\n", print);
else
exit(0);
}
斐波那契是我学习的第一个递归示例之一,我在基本层面上理解它。但是,当我运行程序时,将 10 作为给定参数(尽管任何参数都会产生不正确的结果),我得到一个以以下结尾的垃圾流:(-1861761537
有很多这样的负数),17。我所做的任何更改都会导致不同的垃圾值,但最终仍为 17。
我相信问题在于我使用了waitpid,但我不知道它会是什么。我是否正确假设这是我的错误的根源?我搜索了教科书、手册页、互联网等,但我不知道我能解决什么问题。任何帮助将不胜感激。谢谢你。