Почему fork () не создает несколько процессов или делает это? - PullRequest
2 голосов
/ 16 сентября 2010

Сегодня у нас было школьное упражнение, чтобы создать несколько процессов. Наша проблема заключалась не в самом коде и не в понимании fork ().

Проблема, с которой столкнулись я и мой друг, заключалась в том, что он не создал 4 процесса нашего кода, как показано ниже:

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>

//kod

int child1();
int child2();

int main() {

        pid_t pid1, pid2;
        int i;

        pid1 = fork();
        pid2 = fork();

        if(!pid1)
                child1();
        else if(!pid2)
                child2();
        else {
                printf("parentlolololololol");
        }

        for(;;)

        return 0;
}
int child1(){
        for(;;) {
                printf("A");
                fflush(stdout);
                sleep(1);
        }
        return 0;
}

int child2(){
        for(;;){
                printf("B");
                fflush(stdout);
                sleep(1);
        }
        return 0;
}

У нас есть частичное обсуждение того, создает ли программа 4 процесса или нет. Создает ли второй вызов fork () новый процесс дочернего процесса и почему он не задерживается каким-либо циклом в этом случае? Или второй вызов fork () не создает вообще новый дочерний процесс?

Это никак не относится к нашему упражнению, но нам очень любопытно, так как вы должны быть программистом;)

Ответы [ 2 ]

1 голос
/ 16 сентября 2010

Проблема в том, что в этой строке отсутствует точка с запятой:

    for(;;)

    return 0;

Это означает, что основная программа вернет 0 навсегда - фактически только в первый раз.

После первого форка есть два процесса, один из которых pid1 равен 0, а другой - нет. Каждый из этих двух процессов затем вызывает второй оператор fork - два из них будут иметь pid2 == 0, а два - нет.

main ---> fork --> pid1 == 0 --> fork --> pid2 == 0
                                      --> pid2 != 0
               --> pid1 != 0 --> fork --> pid2 == 0
                                      --> pid2 != 0

Итак, есть 4 процесса. При вводе условий, два перехватываются child1, а один перехватывается child2. Основной процесс выхода. Таким образом, выполняется 3 процесса, два из которых печатают «A», а один - «B».

0 голосов
/ 16 сентября 2010

Это так - он дважды разветвляется безоговорочно, создавая 4 процесса (ну, в любом случае, 3 новых).Два из них должны запускать child1 (), один child2 () и один родительский код.Это потому, что у вас есть 4 различных значения для пары pid1 / pid2, и первое if покрывает два из них.

...