Если у вас есть разрыв внутри оператора if, который создает дочерний процесс в цикле for, цикл больше не выполняется? - PullRequest
0 голосов
/ 20 января 2019

Я рассматриваю пример кода в моем учебнике (проблема столовых философов) и в основном методе, прямо перед возвратом 0; Заявление, есть блок кода, который я включил ниже. Предполагается, что этот цикл создаст каждого философа как параллельный раздвоенный процесс. Это означает, что каждый философ казнит философа (i).

Однако, поскольку сразу после оператора if следует перерыв, разве это не означает, что создан только первый философ (i = 0)?

for (i = 0; i < N - 1; ++i)
    if (fork() == 0) 
        break;
philosopher(i) ;

Ответы [ 2 ]

0 голосов
/ 20 января 2019

fork() возвращается дважды: у родителя с ненулевым значением (положительный pid при успехе или отрицательное значение при сбое) и у потомка с pid==0 (если вызов выполнен успешно). if (fork() == 0) выполнит break цикл в дочернем элементе, так что дочерний элемент продолжится в philosopher(i); (где родительский элемент также продолжится, но только после того, как все итерации цикла завершены).

Другими словами,

for (i = 0; i < N - 1; ++i)
    if (fork() == 0) 
        break;
philosopher(i) ;

пытается (fork() не проверено на сбой) запустить philosopher(i); в i=0 to i==N-2 incl. дочерних процессах и затем запустить его с i==N-1 в родительском процессе.

0 голосов
/ 20 января 2019

fork(2) «разбивает» процесс, вызывая его на два независимых процесса, второй дочерний по отношению к первому. В родительском процессе (исходный процесс) он возвращает PID дочернего процесса. В дочернем процессе fork() возвращает 0.

Итак, в вашем примере цикл прерывается только в дочернем процессе, а в родительском процессе продолжается порождение оставшихся философов.

Цикл выполняется N - 1 раз, порождая N - 1 детей-философов. После завершения цикла родительский процесс также вызывает philosopher(i), выполняя N th и последний философ.

...