Как fork () перестает создавать детей? - PullRequest
0 голосов
/ 30 апреля 2018

Может кто-нибудь объяснить мне, как это работает?

если в моем коде есть что-то вроде

int pids[N];
for(int i = 0; i < N; i++){
    pids[i] = fork();
    if(pids[i]==0){
        //do something
        break;
    }
}

Разве я не создал бы N детей, а затем у каждого ребенка снова N детей и оказался бы в цикле?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Разве я не буду создавать N детей

Да.

и затем у каждого ребенка N детей снова

Нет, почему? Каждый дочерний процесс выполняет break; и выходит из цикла. Дальнейшие процессы не создаются.

и в конечном итоге в петле?

Даже если бы у вас не было этого break;, каждый ребенок просто выполнил бы остальную часть цикла for. Он не будет перезапущен с i = 0. Это означает, что на каждой итерации число процессов будет удваиваться, и в результате вы получите всего 2^N процессов. Но с этим break; это просто N.

0 голосов
/ 30 апреля 2018

С http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html (акцент мой):

После создания нового дочернего процесса оба процесса выполнят следующую инструкцию после системного вызова fork () .

Итак, fork() создает дочерний элемент, и дочерний элемент не начинается с начала цикла: он начинается с инструкции после вызова fork, то есть с if(pids[i]==0){, что для дочернего элемента правда. Тогда он сделает что-то , а затем break. Разрыв означает, что он выходит из цикла for, поэтому дочерний процесс не создает больше процессов.

Итак, отец создает N детей, тогда как каждый ребенок выполняет свою работу и выходит из цикла, не создавая больше детей.

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