Почему pid0 печатается дважды со значением при разветвлении? - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь понять, почему переменная pid0 печатается дважды с фактическим идентификатором. Как я понял, pid0 будет установлен в 0 для всех разветвленных процессов после первого раза.

Это моя основная функция:

int main() {
  pid_t pid0, pid1, pid2;

  pid0 = fork();
  pid1 = fork();
  if (pid0 == 0) pid2 = fork();

  printf("pid0: %d, pid1: %d, pid2: %d\n", pid0, pid1, pid2);

  return 0;
}

А вот вывод:

pid0: 3388, pid1: 3389, pid2: 32766
pid0: 3388, pid1: 0, pid2: 32766
pid0: 0, pid1: 3390, pid2: 3391
pid0: 0, pid1: 0, pid2: 3392
pid0: 0, pid1: 3390, pid2: 0
pid0: 0, pid1: 0, pid2: 0

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

После разветвления родительский и дочерний элементы продолжают выполнять следующий код.

Давайте назовем исходный процесс P, а дочерний элемент, созданный с помощью pid0 = fork() P-C1. Оба этих процесса затем выполняются pid1 = fork(). Затем у нас есть еще два процесса, которые я назову P-C2 и P-C1-C3.

Теперь все 4 процесса выполняют оператор if. pid0 равно 0 в P-C1 и P-C1-C3, поэтому они оба выполняют pid2 = fork(). Это создает процессы P-C1-C4 и P-C1-C3-C5, и они наследуют нулевое значение pid0.

Когда все это будет сделано, у нас будет pid0 = 0 в процессах P-C1, P-C1-C3, P-C1-C4 и P-C1-C3-C4. И pid0 != 0 в процессах P и P-C2.

Все 6 из этих процессов затем выводят pid0.

2 голосов
/ 11 февраля 2020

Ваш первый fork() создает второй процесс. Ваш второй работает на обоих процессах, и вы получите четыре процесса. У двух из них pid0 установлено значение 0, у двух других - нет.

Исходный разветвленный процесс (pid0 === 0) и его клон снова вызовут fork(), так что есть еще два процесса , всего шесть.

Из этих четырех являются частью исходного дерева fork(), а два также находятся во вторичном дереве (pid1 == 0).

Если вам нужен только один родитель Для этого процесса вы должны ввести второй fork() и избегать его, если pid0 не равен нулю.

Обратите внимание, что во второй строке вашего вывода есть pid1: 0, что указывает на то, что это клон.

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