Это связано с тем, что оператор &&
имеет short-circuit evaluation. В принципе, для любого выражения x && y
, сначала оценивается x
. Если результат равен false
, y
не оценивается вообще, и все выражение оценивается в false
. В противном случае результатом будет оценка y
, при необходимости, в виде булева. Так, например, false && printf("Is this evaluated?\n")
ничего не печатает.
Это означает, что fork() && fork()
сначала оценивает первый fork()
и оценивает второе, если и только если первый результат приводит к ненулевому результату. В частном случае функции fork()
это происходит только в родительском процессе, так как ребенок получает статус возврата 0
. Таким образом, исходные родительские вилки дважды, но у детей этого нет. В результате будет создано только три процесса.
Оператор &
, с другой стороны, не имеет оценки короткого замыкания, поскольку он не является логическим - И, но побитовым - И. Поскольку &
не относится к логическим значениям, а о битах (в отличие от &&
), оба аргумента всегда оцениваются. Это означает, что в случае fork() & fork()
родитель будет вилка дважды, а первый ребенок снова разветвится, что приведет к четырем различным процессам.
Кстати, вы должны изучать язык C, а не прыгать прямо на fork()
. Если вы используете инструмент, вы не понимаете, что такие проблемы возвратятся вам часто.
Способ, которым я хотел бы подойти к этой проблеме, - сначала узнать разницу между '&' и '&&', найдя ресурс о операторах C. Затем я узнал, что делает «fork», читая для него спецификацию POSIX или справочную страницу Linux. –