fork()
Примитив часто тянется воображение. Пока вы не почувствуете это, вы должны проследить на бумаге, что такое каждая операция, и учесть количество процессов. Не забывайте, что fork () создает почти идеальную копию текущего процесса. Наиболее существенным отличием (для большинства целей) является то, что fork()
возвращаемое значение отличается между родителем и ребенком. (Поскольку этот код игнорирует возвращаемое значение, это не имеет значения.)
Итак, во-первых, есть один процесс. Это создает второй процесс, который печатает точку и цикл. На второй итерации каждый создает другую копию, поэтому четыре процесса печатают точку и затем завершают работу. Таким образом, мы можем легко объяснить шесть точек, как вы ожидаете.
Однако, что printf()
действительно делает, так это буферизирует вывод. Таким образом, первая точка, когда было только два процесса, не появляется при записи. Эти точки остаются в буфере, который дублируется в fork (). Только когда процесс собирается завершиться, появляется буферизованная точка. Четыре процесса печатают буферизованную точку, плюс новый дает 8 точек.
Если вы хотите избежать такого поведения, позвоните fflush(stdout);
после printf()
.