奇怪的结果在斐波那契的fork()函数中,代码顺序不同

刚斗

当我尝试使用该fork()函数让子进程递归调用时doFib,我得到了奇怪的结果,sum1并且sum2这些结果是在父进程中设置的,但是当我想使用它们来计算结果时,事实证明它们不是正确设置。但是,如果我在之前替换了第一个while循环pid2 = fork(),则可以得到正确的结果。谁能解释为什么会这样?

static void doFib(int n, int doPrint)
{
    int result;

    pid_t pid1;
    int status1;
    int sum1 = 0;
    pid_t pid2;
    int status2;
    int sum2 = 0;
    //printf("my pid is: %d\n", getpid());
    //test for less number
    if(n < 2)
    {
        if(doPrint)
        {
            printf("%d\n", n);
        }
        _exit(n);//result the value of F0 and F1
    }
    //not initial, need fork here
    pid1 = fork();
    if(pid1 == 0)
    {//in children 1
        doFib(n-1, 0);
    }

    pid2 = fork();
    if(pid2 == 0){
        doFib(n-2, 0);
    }

    while((pid1 = waitpid(-1, &status1, 0)) > 0){
        if(WIFEXITED(status1))
            sum1 = WEXITSTATUS(status1);
    }
    while((pid2 = waitpid(-1, &status2, 0)) > 0){
        if(WIFEXITED(status2))
            sum2 = WEXITSTATUS(status2);
    }

    result = sum1 + sum2;
    if(doPrint)
    {
        printf("%d\n", result);
    }else
    {//in the children
        _exit(result);
    }
}
dbush

您对的退货状态的检查waitpid不正确。成功时返回子进程的pid,错误时返回-1。您无需循环执行此操作。只需执行一次,然后获取成功的返回值。

if ((pid1 = waitpid(-1, &status1, 0)) != -1) {
    if(WIFEXITED(status1))
        sum1 = WEXITSTATUS(status1);
}
if ((pid2 = waitpid(-1, &status2, 0)) != -1) {
    if(WIFEXITED(status2))
        sum2 = WEXITSTATUS(status2);
}

就是说,递归计算斐波那契数是效率低下的,尤其是当通过派生完成递归时。由于进程的返回值只有一个字节宽,因此这也将返回数限制为255。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章