Вилка () - Практические вопросы
Предпосылка: основы вилки, вилки и бинарного дерева,
Example1:
What is the output of the following code?
#include <stdio.h> #include <unistd.h> int main() { if (fork() || fork()) fork(); printf ( "1 " ); return 0; } |
Выход:
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> int main() { if (fork()) { if (!fork()) { fork(); printf ( "1 " ); } else { printf ( "2 " ); } } else { printf ( "3 " ); } printf ( "4 " ); return 0; } |
Выход:
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> int main() { if (fork() && (!fork())) { if (fork() || fork()) { fork(); } } printf ( "2 " ); return 0; } |
Выход:
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).