Как запустить два дочерних процесса одновременно в C? - PullRequest
3 голосов
/ 20 сентября 2011

Так что я вхожу в параллельное программирование, но по какой-то причине я даже не могу заставить работать основы. У меня есть файл с именем fork.c, который содержит метод main. В этом методе main я разветвляюсь дважды, на дочерние процессы 1 и 2.

У ребенка 1 я печатаю символ «А» 50 раз.

У ребенка 2 я печатаю символ «B» 50 раз.

Когда я запускаю свой код, я получаю вывод AAAAA ... AAAABBBBBB .... BBBBBB. Но никогда не похоже на ABABABABABABAB .... На самом деле, иногда я даже получаю BBBBB .... BBBBAAAA .... AAAAA.

Так почему я испытываю это поведение? Возможно, я поступаю по этому поводу совершенно неправильно.

#include <stdlib.h>
#include <stdio.h>

void my_char(char n) {
    write(1, &n, 1);
}

int main() {
    int status;
    pid_t child1, child2;

    if (!(child1 = fork())) {
        // first childi
        int a;
        for (a = 0; a < 50; a++) {
            my_char('A'); 
        }
        exit(0);
    } else if (!(child2 = fork())) {
        // second child
        int a;
        for (a = 0; a < 50; a++) {
            my_char('B');
        }
        exit(0);
    } else {
        // parent
        wait(&child1);
        wait(&child2);
        my_char('\n');
    }

    return 0;
}   

Ответы [ 2 ]

8 голосов
/ 20 сентября 2011

Они работают одновременно, но процессы завершаются практически сразу после запуска.Другими словами, они слишком малы, чтобы фактически иметь какое-либо реальное перекрытие.

РЕДАКТИРОВАТЬ:

Время, необходимое для запуска другого процесса, больше, чем время, необходимое для их запуска.Поэтому вероятность совпадения мала.(есть также проблемы с буферизацией, которые я опущу)

Вам нужно, чтобы каждый процесс выполнял больше работы, чем это.Попробуйте напечатать более 50. Возможно, будет достаточно печати более 10000.

3 голосов
/ 21 июня 2012

Я думаю, что гораздо проще понять, как работает fork ():

#include <stdlib.h>
#include <stdio.h>

int main() {
    pid_t child1, child2;
    printf("Start\n");
    if (!(child1 = fork())) {
        // first childi
        printf("\tChild 1\n");
        sleep(5);
        exit(0);
    } else if (!(child2 = fork())) {
        // second child
        printf("\tChild 2\n");
        sleep(5);
        exit(0);
    } else {
        // parent
        printf("Parent\n");
        wait(&child1);
            printf("got exit status from child 1\n");
        wait(&child2);
            printf("got exit status from child 2\n");
    }

    return 0;
}

... и вот вывод:

    Start
        Child 1
    Parent
        Child 2
    got exit status from child 1
    got exit status from child 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...