как породить нескольких детей, где каждый ребенок делает разные вещи? - PullRequest
0 голосов
/ 12 июля 2011

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

У меня было что-то вроде этого:

int main (int argc, const char * argv[])
{
    pid_t pids[2];

    int i;
    for (i = 0; i < 2; ++i) {
        if ((pids[i] = fork()) < 0) {
            fprintf(stderr, "Error. Couldn't fork\n");
            exit(EXIT_FAILURE);
        } else if (pids[i] == 0) { // child
            if (i == 0) {
                readerChild();
            } else {
                writerChild();
            }
        }
    }

    //parent stuff;

    for (i = 0; i < 2; ++i) {
        wait(NULL);
    }

    return 0;
}

но, согласно моим выводам, два писателя-ребенка создаются, когда я хотел только одного.

Ответы [ 3 ]

2 голосов
/ 12 июля 2011

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

P --> fork --> fork --> wait
           |        --> writerChild -- wait
           |
           --> readerChild --> fork --> wait
                                    --> writerChild --> wait
1 голос
/ 12 июля 2011

Это то, что происходит в вашем коде:

Родительская вилка.я по-прежнему равен 0, поэтому readerChild () вызывается этим потомком.Родитель И потомок переходят ко второй итерации цикла.Они ОБА вилки снова.Таким образом, вы получаете 2 писателя детей.Один из них - ребенок, а другой - внук.

В конце вашего дочернего раздела вы должны предотвратить его зацикливание.положить break;

0 голосов
/ 12 июля 2011

Лично я бы просто написал одну функцию на каждого потомка ... если только readerChild () / writerChild () не заблокирует поток и не выйдет, readerChild создаст новый writerChild, поскольку он все еще будет выполняться в контексте этого цикла.

...