Вилка () - Практические вопросы
Предпосылка: основы вилки, вилки и бинарного дерева,
Example1:
What is the output of the following code?
| #include <stdio.h>#include <unistd.h>intmain(){    if(fork() || fork())        fork();    printf("1 ");    return0;} | 
Выход:
1 1 1 1 1

Объяснение:
 1. Он создаст два процесса: один родительский P (имеет идентификатор дочернего процесса), а другой - дочерний процесс C1 (идентификатор процесса = 0).
 2. В операторе if мы использовали оператор ИЛИ (||), и в этом случае второе условие оценивается, когда первое условие ложно.
 3. Родительский процесс P вернет положительное целое число, поэтому он напрямую выполнит оператор и создаст еще два процесса (один родительский P, а другой - дочерний C2). Дочерний процесс C1 вернет 0, поэтому он проверяет второе условие, а второе условие снова создает еще два процесса (один родительский C1, а другой - дочерний C3).
 4. C1 возвращает положительное целое число, поэтому в дальнейшем будет создано еще два процесса (один родительский C1, а другой - дочерний C4). Дочерний C3 возвращает 0, поэтому он напрямую напечатает 1.
Example 2:
What is the output of following code?
| #include <stdio.h>#include <unistd.h> intmain(){    if(fork()) {        if(!fork()) {            fork();            printf("1 ");        }        else{            printf("2 ");        }    }    else{        printf("3 ");    }    printf("4 ");    return0;} | 
Выход:
2 4 1 4 1 4 3 4

Объяснение:
 1. Он создаст два процесса: один родительский P (имеет идентификатор дочернего процесса), а другой - дочерний процесс C1 (идентификатор процесса = 0).
 2. Когда условие истинно, родительский P выполняет оператор if, а дочерний элемент C1 выполняет оператор else и печатает 3. Родительский P проверяет следующий оператор if и создает два процесса (один родительский P и дочерний C2). В операторе if мы используем оператор not (т.е.!), Он выполняется для дочернего процесса C2, а родительский P выполняет часть else и выводит значение 2. Дочерний C2
 далее создает два новых процесса (один родительский C2, а другой - дочерний C3).
Example 3:
What is the output of following code?
| #include <stdio.h>#include <unistd.h> intmain(){    if(fork() && (!fork())) {        if(fork() || fork()) {            fork();        }    }    printf("2 ");    return0;} | 
Выход:
2 2 2 2 2 2 2

Объяснение:
 1. Форк создаст два процесса: один родительский P (имеет идентификатор нового дочернего процесса), а другой - дочерний процесс C1 (идентификатор процесса = 0).
 2. В операторе if мы используем оператор AND (т.е. &&), и в этом случае, если первое условие ложно, оно не будет оценивать второе условие и печатать 2. Родительский процесс P проверяет второе условие и создает два новых процесса (один родительский P и другой ребенок C2). Во втором условии мы используем оператор НЕ, который возвращает истину для дочернего процесса C2, и он выполняет внутренний оператор if.
 3. Дочерний C2 снова создает два новых процесса (один родительский C2 и дочерний C3), и мы используем оператор OR (т.е. ||), который оценивает второе условие, когда первое условие ложно. Родительский C2 выполняет часть if и создает два новых процесса (один родительский C2 и дочерний C4), тогда как дочерний C3 проверяет второе условие и создает два новых процесса (один родительский C3 и дочерний C5).
 4. Родительский C3 входит в состав if и в дальнейшем создает два новых процесса (один родительский C3 и дочерний C6).