[main]
a = 12
b = 9
fork()
|
|
+--------------+--------------+
| |
| |
[parent] [child]
fid = 1234 fid = 0
wait(NULL) a++
... printf("a = 13, b = 9");
... return 0
... <exit>
b = b - 5
printf("a = 12, b = 4");
return 0
<exit>
После выполнения fork()
существует две копии программы. Каждый процесс получает свои собственные копии переменных, поэтому теперь есть два a
, два b
и т. Д. Единственное различие между двумя программами - это значение, возвращаемое из fork()
: в дочернем процессе fork()
возвращает 0; в родительском процессе он возвращает PID дочернего элемента.
Дочерний процесс увеличивает a
, печатает значения a
и b
и выходит.
Родительский процесс сначала ожидает завершения дочернего процесса. Только после того, как ребенок закончил, он продолжает, вычитая 5 из b
, распечатывая a
и b
, и затем выходя.
wait(NULL)
гарантирует, что распечатка дочернего процесса всегда идет раньше, чем распечатка родителя, поэтому вы всегда будете получать одинаковые выходные данные в надежном порядке. Без этого вы не сможете зависеть от порядка двух распечаток. Это будут те же сообщения, но в непредсказуемом порядке.