Как в родительском, так и в дочернем элементе число равно 0 для первого printf
. И в родительском, и в дочернем случае печатается 0, за которым следует другое значение. В родительском процессе другое значение равно 2. В дочернем процессе другое значение равно 1.
Однако важно отметить, что, хотя каждый процесс имеет принудительный порядок, согласно которому ноль должен быть напечатан перед другим числом, нет никаких ограничений на печать двух процессов относительно друг друга.
Вот аналогия из реальной жизни: предположим, что мой коллега и я уходим с работы в одно и то же время, останавливаемся в продуктовом магазине, а затем возвращаемся домой. Мы знаем, что я был в магазине до того, как оказался у себя дома, и мы знаем, что он был в продуктовом магазине до того, как оказался у себя дома. Но мы не знаем, кто первым был в продуктовом магазине или кто первым был дома. Каждый из нас может прийти в продуктовый магазин примерно в одно и то же время, а затем вернуться домой примерно в одно и то же время, или, может быть, он задержится, и я доберусь до продуктового магазина и домой еще до того, как он доберется до магазина.
Чего не произойдет, так это печати 1 или 2 более одного раза. Хотя после возврата fork
у нас есть два процесса, запущенных концептуально одновременно, и время их событий относительно друг друга не указано, порядок событий в каждом процессе четко определен. Каждый процесс установит num
либо в 1, либо в 2, прежде чем распечатать его снова, и поскольку fork
определено так, чтобы возвращать 0 в дочернем элементе и pid дочернего элемента в родительском, каждый из них будет устанавливать разные значения.
На самом деле есть еще один разумный выход: 00
. Если fork
не может создать новый процесс, возвращается -1. В этом случае программа напечатает 0
, if
и else if
с ошибкой, потому что -1 не 0 и не больше 0, число не изменилось, и программа снова напечатает 0
.
Если вы хотите узнать больше об определении порядка эффектов в программах на C, ключевыми словами для поиска являются «точки последовательности». В этой программе это довольно просто (не считая того факта, что у нас одновременно запущены две копии), но иногда это может быть менее очевидно.
person
Samuel Edwin Ward
schedule
07.03.2013
#include <unistd.h>
. Это правильный заголовочный файл дляfork()
. - person Deanie   schedule 17.05.2015