Давайте посчитаем их:
int main(){
if (fork()){ // 1
if (!fork()) // 2
fork(); // 3
}
fork(); // 4
printif("1 ");
}
Когда вы запустите программу, у вас будет первый процесс, который будет предком всех остальных.
fork_1
создаст дочерний процесс , последний будет иметь 0 как возвращаемое значение. поэтому он будет продолжен после оператора if, затем запустится fork_4
, следовательно, будет создан другой дочерний элемент. printf
выполняется дважды (2) на данный момент.
Давайте продолжим первый процесс, получивший ненулевое значение, он выполнит fork_2
, а затем получит ненулевое возвращаемое значение. Он продолжается после второго оператора if, запускается fork_4
. Будет два процесса (предок и его дочерний процесс) => еще два printf
.
Дочерний процесс, созданный в fork_2
, получит возвращаемое значение null, поэтому условие if истинно. Он запускает fork_3
, что дает два процесса, и каждый из них запускает fork_4
. Таким образом, printf будет запущен четыре (4) раза.
В конце printf будет запущен 8 раз. Таким образом, вы получите восемь 1
.