Один дополнительный процесс будет создан каждый раз, когда вызывается fork
.
При первом вызове fork
родительский процесс P создает подпроцесс SP1. После того, как fork, родительский процесс вызовет fork
еще раз (пропустив if
), создав подпроцесс SP2.
SP1 после вызовов fork fork
внутри if
, создает под-подпроцесс SSP1. SP1 затем порождает нить. SP1 оставляет if
. и снова вызывает fork
, создавая суб-подпроцесс SSP2.
SSP1 порождает нить. SSP1 оставляет if
и вызывает fork
, создавая суб-суб-процесс SSSP.
Таким образом, процессы, созданные: SP1, SP2, SSP1, SSP2, SSSP = 5 процессов. Если вы считаете исходный процесс P, существует 6 процессов.
Только SP1 и SSP1 порождают потоки, поэтому создаются 2 потока. Если вы подсчитаете все основные потоки всех процессов, есть 7 или 8 потоков, в зависимости от того, считаете ли вы исходный процесс P.
Иллюстрация процессов и потоков, создаваемых в соответствии с кодом.
P
pid t pid; |
pid = fork(); +------SP1
if (pid == 0) { | |
fork(); | +---------------SSP1
thread create(...); | |-SP1's thread |-SSP1's thread
} | | |
fork(); +-SP2 +-SSP2 +-SSSP
| | | | | |
Нет петли. Это «если». – QuentinUK
Почему 8 процессов? один из вызовов 'fork' находится в тесте if. – didierc