Сколько процессов будет создано из fork () в этом коде? - PullRequest
0 голосов
/ 26 мая 2020

Это вопрос из одной из моих задач, и я немного запуталась с ним.

int main() 
{ 
  printf("line\n");
  pid_t pid = fork();
  fork();
  fork();
  if(pid == 0)
    fork();

  fork();
  printf("line\n");
  return 0; 
} 

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

При выполнении кода он сгенерирует 28 строк вывода и просто не уверен как найти количество процессов, созданных в этом операторе.

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Всего будет 24 процесса. Вот как это сделать.

После первого fork () есть два процесса. В одном из них pid == 0; в другом процессе pid != 0.

После второй вилки есть 4 процесса (половина из них имеет pid == 0).

После третьей вилки есть 8 процессов (и половина у них есть pid == 0).

Четвертый оператор fork выполняется только теми процессами, у которых pid == 0. Таким образом, 4 процесса выполнят fork (и превратятся в 8 процессов). Остальные 4 процесса не будут выполнять fork и останутся 4. Всего у нас есть 8 + 4 = 12 процессов.

Наконец, еще один fork превращает наши 12 процессов в 24.

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

Теперь вопрос о семантике. Вы говорите, что процессы не являются потоками, и поэтому создаются 0 потоков? Вы говорите, что из 24 процессов первый является исходным процессом и не создается этим кодом, так что всего создается 23 процесса? Это вопрос семантики, а не программного обеспечения, поэтому мы не можем вам с этим помочь.

Количество напечатанных строк

Первый printf выполняется только оригинальный процесс (так как он еще не разветвлялся). Второй printf выполняется всеми 24 процессами (непосредственно перед завершением каждого процесса). Таким образом, всего печатается 25 строк.

1 голос
/ 26 мая 2020

введите описание изображения здесь

Как указано выше, производятся 24 листа. Таким образом, 24 процесса производят окончательно. И перед вашей первой вилкой «линия» будет напечатана один раз. После того, как вы fork, из-за 24 процессов будут напечатаны 24 строки. Так что у вас будет 25 строк.

...