вопрос о разветвлении в Linux - PullRequest
0 голосов
/ 03 мая 2011

Я сейчас изучаю операционные системы, у меня есть этот фрагмент кода, но я получаю бесконечный цикл рекурсивных вызовов, все, что я хочу, - это создать сына и вычислить Фибоначчи (с небольшими числами), я не могу понять почему сыновья вообще не могут закончить, заранее спасибо:

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 голосов
/ 04 мая 2011

«поведение по умолчанию» из wait() должно немедленно вернуться с -1, если у него нет детей, которые могут быть убиты, как вы ожидали:

wait () : в случае успеха возвращает идентификатор процесса прерванного потомка;в случае ошибки возвращается -1.

и

ECHILD (для wait () ) Вызывающий процесс выполняетне иметь никаких нежданных детей.

Мой быстрый тест подтверждает, что программа работает.Однако в поведении wait() могут быть некоторые различия.

С другой стороны, вы знаете, сколько детей у вас fork() '(argc много).Поэтому, возможно, более правильная версия цикла wait() выглядит так:

if (son_pid) {
    int i, status;
    for (i = 0; i < argc; i++) {
        wait(&status);
    }
}

Надеюсь, это поможет.

0 голосов
/ 03 мая 2011

Возможно, это не решение проблемы, но попытайтесь поставить возврат 0 вместо разрыва;

Я верю, что проблема заключается в том, что сын / сын разветвляются против родительского кода.Я не понимаю, почему вы положили перерыв там.После расчета фибоначчи сын должен вернуться.Перерыв может привести к нежелательным результатам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...