Сначала это утомительно, но вы, кажется, это понимаете, когда вызываете fork ():
вызывающий процесс («родитель»)
по существу дублируется
операционная система и дубликат процесса
становится "ребенком"
с уникальным идентификатором PID
возвращаемое значение из fork ()
вызов либо: целое число
0, 1 означает, что
Программа получения возврата 0 является
«Ребенок»; или это ненулевой целочисленный PID
этого раздвоенного ребенка; и
новый дочерний процесс введен в
очередь планирования для выполнения.
Родитель остается в расписании
очередь и продолжает выполняться как
до этого.
Именно этот (0 .xor. non-0) возврат из fork () сообщает программе, какую роль он играет в данный момент - возвращается 0, программа является дочерним процессом; все остальное возвращается, программа является родительским процессом.
Если программе, исполняющей родительскую роль, требуется много детей, он должен выполнить fork () для каждого из них отдельно; нет такой вещи, как несколько детей, совместно использующих вилку ().
Промежуточные результаты, безусловно, могут быть отправлены через канал.
Что касается вызова каждого дочернего элемента с различными параметрами, на самом деле ничего особенного делать не нужно: вы можете быть уверены, что когда ребенок получит контроль, он будет иметь (копии) точно таких же переменных, что и родительский элемент. Таким образом, передача параметров ребенку зависит от установки родителем значений переменных, с которыми он хочет, чтобы ребенок работал; и затем вызывая fork ().
1 Точнее: fork () возвращает значение типа pid_t
, которое в наши дни идентично целому числу в довольно многих системах.