Я не разобрался со всеми комбинациями в конце, но это должно вас заинтересовать.
Вы начинаете с родительского процесса. Он вызовет fork()
3 раза и напечатает
Process 0 created child 1
Process 0 created child 2
Process 0 created child 3
После первого форка есть один дочерний процесс с id = 1
. Этот процесс продолжит цикл, поэтому он напечатает
Process 1 created child 2
Process 1 created child 3
Затем родительский процесс разветвит дочерний процесс с id = 2
. Этот процесс также продолжит свой цикл, поэтому он напечатает
Process 2 created child 3
Это все дети первого поколения. Но дочерний элемент 1 также разветвляет своего собственного дочернего элемента 2, который будет печатать
Process 2 created child 3
Все процессы, которые разветвляются, когда i = 3
немедленно выходят из цикла. Они больше не разветвляют дочерние элементы и ничего не печатают, поэтому их можно игнорировать.
Каждый процесс печатает свои сообщения по порядку, но они могут быть перемежены между процессами в любом порядке. Одно ограничение заключается в том, что дочерний элемент не может ничего печатать до того, как его родитель напечатает сообщение о том, что он создал более раннего дочернего элемента, потому что сообщение печатается до итерации, которая создает дочерний элемент (я предполагаю, что вывод буферизуется строкой). Но он может печатать свои собственные сообщения перед сообщением о том, что он был создан!
Таким образом, первые два сообщения могут быть:
Process 0 created child 1
Process 1 created child 2
or
Process 1 created child 2
Process 0 created child 1
person
Barmar
schedule
10.04.2019
printf("Process %d[%d] created child %d\n", getpid(),id, i);
(и дочерний pid тоже) - person wildplasser   schedule 11.04.2019