关于在Linux中分叉的问题

时间:2011-05-03 08:59:48

标签: c linux linux-kernel

我目前正在学习操作系统,我有这段代码,但我收到无限循环的递归调用,我想要的是创建一些儿子并计算斐波纳契(用小数字),我无法理解为什么儿子根本无法完成,提前谢谢:

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

编辑

所有检查都完成了,问题是逻辑!!!

2 个答案:

答案 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);
    }
}

我希望这会有所帮助。