我目前正在学习操作系统,我有这段代码,但我收到无限循环的递归调用,我想要的是创建一些儿子并计算斐波纳契(用小数字),我无法理解为什么儿子根本无法完成,提前谢谢:
int fibonaci(int n) {
if(n < 2){
return n;
}
return fibonaci(n - 1) + fibonaci(n - 2);
}
int main(int argc, char* argv[]) {
//some checkings, and variables
for (i = 0; i < argc; ++i) {
son_pid = fork();
if (son_pid == 0) {
fibonaci(var); //var is some finite variable
break;
}
}
if(son_pid != 0){
while(wait(&status) != -1){}
}
return 0;
}
所有检查都完成了,问题是逻辑!!!
答案 0 :(得分:0)
这可能不是解决方案,但尝试返回0而不是中断;
我确实认为问题在于分叉/治疗儿子与父母代码。我不知道为什么你把休息放在那里。计算完斐波纳契后,儿子应该回来。休息可能会产生一些不必要的结果。
答案 1 :(得分:0)
wait()
的{{3}}将立即返回-1
,如果它没有可以被杀死的孩子,就像您预期的那样:
wait():成功时,返回已终止子项的进程ID;出错时,返回-1。
和
ECHILD (对于 wait())调用进程没有任何未经等待的子进程。
我的快速测试证实该程序有效。但是,wait()
行为可能会有一些变化。
从好的方面来说,你知道你有多少孩子fork()
'(argc
多少个孩子。因此,wait()
循环可以说更正确的版本是:
if (son_pid) {
int i, status;
for (i = 0; i < argc; i++) {
wait(&status);
}
}
我希望这会有所帮助。