首页 > 解决方案 > 例如 fork()、c 语言

问题描述

我正在学习fork()并试图理解我发现的这个例子。据我所知,我们总是为每个调用使用不同的过程,无论是 forfibonacci(n-1)fibonacci(n-2); pid1被挂起以waitpid()将孩子的最后退出状态保存在 fib 中。发生同样的事情pid2,最后,最后两个进程的返回值相加。说的时候公平吗?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

size_t fibonacci( size_t n )
{
    pid_t pid1, pid2;
    size_t fib;
    int status;

    switch (n)
    {
    case 0:
        return 0;
    case 1:
        return 1;
    case 2:
        return 1;
    default:
        break;
    }

    pid1 = fork();
    if (pid1 == 0)
        exit( fibonacci( n - 1 ));           // chiamo fibonacci(n-1) usando pid1
    else if (pid1 < 0)
    {
        printf("ERRORE");
        exit(EXIT_FAILURE);
    }

    pid2 = fork();

    if (pid2 == 0)
        exit( fibonacci( n - 2 ));          // chiamo fibonacci(n-1) usando pid2
    else if (pid2 < 0)
    {
        printf("ERRORE");
        exit(EXIT_FAILURE);
    }
    if (waitpid( pid1, &status, 0 ) == -1) // sospende pid1
    {
        printf("ERRORE");
        exit(EXIT_FAILURE);
    }

    fib = WEXITSTATUS( status ); // salvo in fib lo stato di uscita del figlio di pid1

    if (waitpid( pid2, &status, 0 ) == -1)  // sospendo pid2
    {
        printf("ERRORE");
        exit(EXIT_FAILURE);
    }

    return fib + WEXITSTATUS( status ); // recupero valori di ritorno dei processi
}

int main(int argc, char *argv[])
{
    int a = atoi(argv[1]);

    if (a > 0 && a < 10)
    {
        printf("Calcolo fibonacci di %d \n", a);

        printf("L' %so numero di Fibonacci e' %d.\n", argv[1], fibonacci(a));
    }
    else
    {
        printf("Devi inserire un numero compreso tra 1 e 10\n");
        exit(EXIT_FAILURE);
    }
}

标签: cfork

解决方案


推荐阅读