Рекурсивный Фибоначчи с использованием вилок (на C)

Я пытаюсь написать функцию, которая рекурсивно вычисляет результирующее число Фибоначчи из заданного int n, используя forks на C.

Вот спецификация функции: Если print is true, выведите его. В противном случае передайте его родительскому процессу. Решение должно быть рекурсивным, и для каждого вызова оно должно создавать новый дочерний процесс. Каждый процесс должен вызывать doFib() ровно один раз. Подпись метода не может быть изменена. Вспомогательные функции не могут быть использованы.

Вот что я написал на данный момент, основываясь на своем понимании fork. Я пытаюсь выполнить fork дважды, чтобы породить два дочерних процесса. Один для выполнения fib(n-1), а другой для выполнения fib(n-2). Таким образом, я могу получить оба результата и объединить их.

static void doFib(int n, int doPrint)
{
    pid_t pid1;
    pid_t retpid1;
    int status1;

    pid_t pid2;
    pid_t retpid2;
    int status2;

    pid = fork();
    if (pid == 0) // Child Process 1
    {
        exit(100); // sends 100 to the parent
    } 
    else if (pid > 0) // Parent Process 1
    {
        pid2 = fork();
        if (pid2 == 0) // Child Process 2
        {
            exit(200); // sends 200 to the parent
        }
        else if (pid2 > 0) // Parent Process 1
        {

        }

        retpid = waitpid(pid,&status,0);
        if (pid != retpid)
        {
            printf("waitpid error\n");
        }
        printf("I got this value from my child process 1: %d\n", WEXITSTATUS(status));
    } 
}

Мои вопросы:

1. Как мне захватить оба значения выхода из двух дочерних процессов? Я знаю, как захватить одно (см. код), но как захватить оба?

2. Поскольку doFib не возвращает значение, как мне получить значение вызова doFib в любом из дочерних процессов, чтобы объединить их?

3. Правильно ли я делаю форки? Я был уверен в одном форке, а от двух у меня уже голова болит.

Это практическая промежуточная задача из серии, которую я сейчас прорабатываю, чтобы подготовиться к предстоящему экзамену.

6
задан Alan Stokes 6 February 2012 в 07:39
поделиться