Сколько процессов создается с помощью этих fork() операторов?
Я считаю, что это создает 24 процесса; однако, мне нужна проверка. Эти вопросы часто преследуют меня. Спасибо за помощь!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid = fork();
pid = fork();
pid = fork();
if (pid == 0)
{
fork();
}
fork();
return 0;
}
Ответы
Ответ 1
С этим легко рассуждать. Вызов fork
создает дополнительный процесс каждый раз, когда он выполняется. Вызов возвращает 0
в новый (дочерний) процесс и идентификатор процесса дочернего элемента (но не нуль) в исходном (родительском) процессе.
pid_t pid = fork(); // fork #1
pid = fork(); // fork #2
pid = fork(); // fork #3
if (pid == 0)
{
fork(); // fork #4
}
fork(); // fork #5
- Fork # 1 создает дополнительные процессы. Теперь у вас есть два процесса.
- Fork # 2 выполняется двумя процессами, создавая два процесса, в общей сложности четыре.
- Вилка № 3 выполняется четырьмя процессами, создавая четыре процесса, в общей сложности восемь. Половина из них имеют
pid==0
и половина имеют pid != 0
- Fork # 4 выполняется половиной процессов, созданных fork # 3 (так, четыре из них). Это создает четыре дополнительных процесса. Теперь у вас двенадцать процессов.
- Вилка № 5 выполняется всеми двенадцатью оставшимися процессами, создавая еще двенадцать процессов; теперь у вас двадцать четыре.
Ответ 2
Вычислите таким образом:
Начните с 1 (Основной процесс) и для каждой вилки сделайте это дважды, если fork не находится внутри if (pid == 0), иначе добавьте 1/2 текущего процесса к текущему числу процессов.
В вашем коде:
1P
Получил # 1 fork(), чтобы удвоить текущее количество процессов. Теперь новый номер процесса 2P
Получите # 2 fork(), чтобы удвоить текущее количество процессов. Теперь новый номер процесса 4P
Получите 3 fork(), чтобы удвоить текущее количество процессов. Теперь новый номер процесса 8P
Получите # 4 fork(), но ждите его, если условие so (8 + 4 = 12) P
Получите # 5 fork(), чтобы удвоить текущее количество процессов. Теперь новый номер процесса 24P
Ответ 3
Вы правы. Он 24. Просто скомпилировал и запустил его с printf перед окончательным возвратом. Получено 24 строки вывода.