Вилка () - Практические вопросы

Опубликовано: 16 Февраля, 2022

Предпосылка: основы вилки, вилки и бинарного дерева,

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).

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с Базовым курсом C для базового и продвинутого C.