Q1. Linux (или UNIX в целом) пожинает дочерние процессы, только если родительский процесс умирает раньше дочернего. В этом случае ядро позволяет некоторому процессу, определенному реализацией (который раньше был процессом init
), принять потерянный процесс. Затем этот новый родительский процесс будет реагировать на изменения состояния процессов.
Q2. Формирование и обработка одной задачи на процесс - это один из способов параллельной обработки нескольких задач. В зависимости от ваших требований это часто приводит к гораздо более простому коду, чем обработка нескольких задач в одном процессе. В некоторых случаях это единственный возможный способ. Использование потоков является аналогичным решением. Другим решением было бы использовать select
перед всеми возможными блокировками вызовов и убедиться, что вы обрабатываете часть каждой задачи один за другим.
Запуск CGI-программ означает, что вам нужно запустить интерпретатор сценариев. Если вы не внедрили интерпретатор самостоятельно, это означает, что вы должны запустить отдельную программу, которой сложно управлять. Когда сценарий занимает много времени или блокирует по какой-то причине, вы не хотите блокировать все другие задачи. Поэтому проще запускать его в дочернем процессе параллельно с принятием и обработкой запросов в родительском или других дочерних процессах.
В этом случае трудно или часто невозможно предотвратить блокирование других задач отдельной программой, поэтому лучше сделать это в дочернем процессе.