Рубрики

fork () и двоичное дерево

Дана программа на системный вызов fork () .

#include <stdio.h>
#include <unistd.h>

int main()

{

   fork();

   fork() && fork() || fork();

   fork();

  

   printf("forked\n");

   return 0;

}

Сколько процессов будет создано после выполнения вышеуказанной программы?

Системный вызов fork () порождает процессы как листья растущего двоичного дерева. Если мы вызовем fork () дважды, он вызовет 2 2 = 4 процесса. Все эти 4 процесса образуют листовые потомки двоичного дерева. В общем, если мы уровень l , и fork () вызывается безоговорочно, у нас будет 2 l процессов на уровне ( l + 1 ). Это эквивалентно числу максимальных дочерних узлов в двоичном дереве на уровне ( l + 1 ).

В качестве другого примера, предположим, что мы вызывали вызов fork () 3 раза безоговорочно. Мы можем представить порожденный процесс, используя полное двоичное дерево с 3 уровнями. На уровне 3 у нас будет 2 3 = 8 дочерних узлов, что соответствует количеству запущенных процессов.

Примечание к логическим операторам C / C ++:

Логический оператор && имеет больший приоритет, чем ||, и имеет ассоциативность слева направо. После выполнения левого операнда будет оцениваться окончательный результат, и выполнение правого операнда зависит от результата левого операнда, а также от типа операции.

В случае AND (&&) после вычисления левого операнда правый операнд будет оцениваться, только если левый операнд оценивается как ненулевой . В случае ИЛИ (||), после вычисления левого операнда, правый операнд будет оцениваться, только если левый операнд оценивается в ноль .

Возвращаемое значение fork ():

Справочные страницы fork () приводят следующую выдержку из возвращаемого значения,

« В случае успеха PID дочернего процесса возвращается в родительском, а 0 — в дочернем. В случае ошибки -1 возвращается в родительский процесс, дочерний процесс не создается и значение errno устанавливается соответствующим образом. »

PID похож на дескриптор процесса и представлен как unsigned int . Мы можем заключить, что fork () вернет ненулевое значение в parent и ноль в child. Давайте проанализируем программу. Для удобства обозначьте каждую вилку (), как показано ниже,

#include <stdio.h>
int main()
{
   fork(); /* A */
   ( fork()  /* B */ &&
     fork()  /* C */ ) || /* B and C are grouped according to precedence */
   fork(); /* D */
   fork(); /* E */

   printf("forked\n");
   return 0;
}

На следующей диаграмме представлено графическое представление новых процессов. Все вновь созданные процессы распространяются по правой стороне дерева, а родители — по левой стороне дерева, последовательно.

Рекомендуемые посты:

fork () и двоичное дерево

0.00 (0%) 0 votes