Почему мне нужно `wait ()` для дочерних процессов?

Несмотря на то, что справочная страница linux для wait 1 очень хорошо объясняет, что вам нужно wait () для дочерних процессов, для них нет чтобы превратиться в зомби, он вообще не говорит почему.

Я спланировал свою программу (которая является моей первой многопоточной программой, извините за мою наивность) вокруг цикла for (;;) , который запускается дочерние процессы, которые удаляют exec () и обязательно завершаются сами по себе.

Я не могу использовать wait (NULL) , потому что это делает невозможным параллельное вычисление, поэтому я ' Вероятно, мне придется добавить таблицу процессов, в которой хранятся дочерние идентификаторы, и использовать waitpid - не сразу, а по прошествии некоторого времени - что является проблемой, потому что время работы дочерних элементов варьируется от нескольких микросекунды до нескольких минут.Если я использую waitpid слишком рано, мой родительский процесс будет заблокирован, когда я использую его слишком поздно, меня захватят зомби, и я больше не смогу fork () , что не только плохо для моего процесса, но может вызвать непредвиденные проблемы во всей системе.

Мне, вероятно, придется запрограммировать некоторую логику использования некоторого максимального количества потомков и заблокировать родителя, когда это число будет достигнуто - но в этом нет необходимости, потому что большинство потомков завершается быстро. Другое решение, которое я могу придумать (создание двухуровневого родительского процесса, который порождает параллельных потомков, которые, в свою очередь, одновременно порождаются и ждут для внуков), сейчас для меня слишком сложно. Возможно, я также смогу найти неблокирующую функцию для проверки дочерних элементов и использовать waitpid только после их завершения.

Тем не менее вопрос:

Почему Linux вообще держит зомби? Почему я должен ждать своих детей? Это для обеспечения дисциплины родительских процессов? За десятилетия использования Linux я так и не получил ничего полезного от зомби-процессов, я не совсем понимаю полезность зомби как «особенности».

Если ответ заключается в том, что родительские процессы должны иметь способ узнать, что случилось с их дочерними процессами, то, ради бога, нет причин считать зомби нормальными процессами и запрещать создание процессов, не связанных с зомби, только потому, что они слишком много зомби.В системе, которую я сейчас разрабатываю, я могу запустить от 400 до 500 процессов, прежде чем все остановится (это плохо обслуживаемая система CentOS, работающая на самом дешевом VServer, который я смог найти, но все же 400 зомби - это меньше, чем несколько килобайт информации. )

15
задан Robby75 29 December 2011 в 08:58
поделиться