Каким образом системный вызов fork () делает дочерний процесс? - PullRequest
0 голосов
/ 06 декабря 2011

Вот мой код для системного вызова fork (),

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<errno.h>
int main(int argc, char *argv[])
{
 pid_t pid;
 pid=fork();
 printf("1st Fork\n");
 printf("Process ID : %d, Parent Process ID : %d\n",getpid(),getppid());
 pid=fork();
 printf("2nd Fork\n");
 printf("Process ID : %d, Parent Process ID : %d\n",getpid(),getppid());
 pid=fork();
 printf("3rd Fork\n");
 printf("Process ID : %d, Parent Process ID : %d\n",getpid(),getppid());
 return 0;
}

Во время выполнения кода я получаю вывод типа

1st Fork
Process ID : 3393, Parent Process ID : 3392
2nd Fork
Process ID : 3394, Parent Process ID : 3393
3rd Fork
Process ID : 3395, Parent Process ID : 3394
3rd Fork
Process ID : 3394, Parent Process ID : 3393
2nd Fork
Process ID : 3393, Parent Process ID : 3392
3rd Fork
Process ID : 3397, Parent Process ID : 3393
3rd Fork
Process ID : 3393, Parent Process ID : 3392
1st Fork
Process ID : 3392, Parent Process ID : 3440
2nd Fork
Process ID : 3398, Parent Process ID : 3392
3rd Fork
Process ID : 3400, Parent Process ID : 3398
3rd Fork
Process ID : 3398, Parent Process ID : 3392
2nd Fork
Process ID : 3392, Parent Process ID : 3440
3rd Fork
Process ID : 3401, Parent Process ID : 3392
3rd Fork
Process ID : 3392, Parent Process ID : 3440

Почему этот системный вызов fork () выполняется8 процесс и как?

Также я получаю 14 операторов printf ().Почему?

Ответы [ 4 ]

3 голосов
/ 06 декабря 2011

Каждый раз, когда вы звоните fork, он возвращается дважды.Один раз в родительском, один раз в новом процессе.Затем, продолжая, они снова разветвляются .

Скорее всего, вы не ожидали, что дети снова разветвляются .С каждым fork у вас обычно есть:

switch (fork()) {
case -1:
    /* ERROR. */
    break;
case 0:
    /* Child process. */
    break;
default:
    /* Parent. */
    break;
}

В вашем коде это выглядит так:

  • У вас есть один процесс, затем он разветвляется
  • Теперь у вас есть два процесса и оба форка
  • Теперь у вас есть 4 процесса и все они форка
  • Теперь у вас 8процессы, и вы задаете вопросы по SO
2 голосов
/ 06 декабря 2011

Цель fork () - создать новый процесс, который становится дочерним процессом вызывающей стороны.

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

Таким образом, в вашем коде каждый форк генерирует два разных пути выполнения, как двоичное дерево высотой 4.

        *
    *       *
  *   *   *   *
 * * * * * * * * 

Всего это 15 узлов, что означает, что вы создаете 14 других процессов.

2 голосов
/ 06 декабря 2011

Я предлагаю еще раз хорошенько рассмотреть ваши результаты - есть восемь процессов:

$ cat <<EOF | sort -u
> 1st Fork
> Process ID : 3393, Parent Process ID : 3392
> 2nd Fork
> Process ID : 3394, Parent Process ID : 3393
> 3rd Fork
> Process ID : 3395, Parent Process ID : 3394
> 3rd Fork
> Process ID : 3394, Parent Process ID : 3393
> 2nd Fork
> Process ID : 3393, Parent Process ID : 3392
> 3rd Fork
> Process ID : 3397, Parent Process ID : 3393
> 3rd Fork
> Process ID : 3393, Parent Process ID : 3392
> 1st Fork
> Process ID : 3392, Parent Process ID : 3440
> 2nd Fork
> Process ID : 3398, Parent Process ID : 3392
> 3rd Fork
> Process ID : 3400, Parent Process ID : 3398
> 3rd Fork
> Process ID : 3398, Parent Process ID : 3392
> 2nd Fork
> Process ID : 3392, Parent Process ID : 3440
> 3rd Fork
> Process ID : 3401, Parent Process ID : 3392
> 3rd Fork
> Process ID : 3392, Parent Process ID : 3440
> EOF
1st Fork
2nd Fork
3rd Fork
Process ID : 3392, Parent Process ID : 3440
Process ID : 3393, Parent Process ID : 3392
Process ID : 3394, Parent Process ID : 3393
Process ID : 3395, Parent Process ID : 3394
Process ID : 3397, Parent Process ID : 3393
Process ID : 3398, Parent Process ID : 3392
Process ID : 3400, Parent Process ID : 3398
Process ID : 3401, Parent Process ID : 3392

Восемь процессов имеют смысл: в вашей программе три fork(2) вызоваи каждый fork(2) вызов будет дублировать запущенный процесс.Поскольку три fork(2) вызова не защищены друг от друга ветвлением, все три будут выполняться: 2 ^ 3 == 8 .

Обновление

Мне понравился Дисплей Криса , но я хотел исправить идею, что всего существует пятнадцать процессов.Поэтому я собираюсь изменить его треугольник, используя разные символы для каждого из процессов:

        ~
    ~       $
  ~   @   $   ^
 ~ ! @ # $ % ^ &
1 голос
/ 06 декабря 2011

Каждый раз, когда вызывается fork (), из той точки, которая называется дочерним процессом, создается копия родительского процесса. Итак, после первого форка у вас есть два процесса (дочерний и родительский) Точно так же, Вторая функция fork () будет вызвана в двух вышеупомянутых процессах, что приведет к дополнительным двум процессам. Аналогично умножение продолжается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...