Сколько процессов создано - PullRequest
       7

Сколько процессов создано

0 голосов
/ 25 февраля 2020

Мне было интересно, сколько процессов создается с помощью fork () в этом коде, я провел некоторую трассировку, и она закончилась 20 процессами, но я просто не уверен, не могли бы вы мне помочь, пожалуйста. спасибо.

#include <stdio.h> 
#include <sys/types.h>

int main()
{
    **
    fork();
    fork();
    if( fork() > 0)
    {
        fork();
        fork();
    }
    return 0;
}

Ответы [ 3 ]

4 голосов
/ 25 февраля 2020

«Посмотрите», как число процессов развивается при выполнении каждого оператора:

/* before */     /* ... */             /* after */
/*      1 */     fork();               /*     2 */
/*      2 */     fork();               /*     4 */
/*      4 */     if (fork() > 0) {     /*     8 (4 go into the if) */
/*      8 */         fork();           /*    12: 4 (outside) + 8 (inside) */
/*     12 */         fork();           /*    20: 4 (outside) + 16 (inside) */
                 }
/*     20 */     /* ... */             /* total processes: 20 */
2 голосов
/ 25 февраля 2020

Давайте обозначим все позиции, в которых создаются процессы:

A:  fork();
B:  fork();
C:  if( fork() > 0)
    {
D:      fork();
E:      fork();
    }
    return 0;

И построим дерево, показывающее все созданные процессы и метку ветвления, из которой они созданы:

enter image description here

В этом дереве узлы изображают процессы, а метки по краям показывают вызов fork(), который создал каждого потомка (например, pro c. 1 созданный pro c .2 через вилку А). Если вы посчитаете узлы, вы увидите, что на самом деле это 20 процессов. (Извините, что не соблюдаю ни строгую BFS, ни DFS для моих имен)

1 голос
/ 25 февраля 2020

Вы можете сделать так, чтобы каждый из ваших процессов печатал точку, добавив следующую строку перед return 0:

write(STDOUT_FILENO, ".", 1);

Если вы посчитаете точки, всего будет 20 процессов, 1 из которых создается, когда Вы запускаете программу.

...