Первобытный примитив часто растягивает воображение. Пока вы не почувствуете это, вы должны проследить на бумаге, что такое каждая операция, и учитывать количество процессов. Не забывайте, что fork() создает почти идеальную копию текущего процесса. Наиболее значительная разница (для большинства целей) заключается в том, что возвращаемое значение fork()
отличается между родительским и дочерним. (Так как этот код игнорирует возвращаемое значение, он не имеет значения.)
Итак, сначала есть один процесс. Это создает второй процесс, оба из которых печатают точку и петлю. На их второй итерации каждый создает другую копию, поэтому четыре процесса печатают точку, а затем выходят. Таким образом, мы можем легко учитывать шесть точек, как вы ожидаете.
Однако, что printf()
действительно делает буфер его выход. Таким образом, первая точка, когда были только два процесса, не появляется при написании. Эти точки остаются в буфере —, который дублируется в fork(). Пока процесс не завершит выход из буферизованной точки. Четыре процесса печати буферизованной точки, плюс новый дает 8 точек.
Если вы хотите избежать этого поведения, позвоните по телефону fflush(stdout);
после printf()
.
[Проверить это сообщение] (http://stackoverflow.com/questions/10909011/how-to-use-fork-to-create-only-2-child-processes/10909090#10909090) – tuxuday
http: //ideone.com/B9HXL –