Несмотря на то, что справочная страница linux для wait 1 очень хорошо объясняет, что вам нужно wait ()
для дочерних процессов, для них нет чтобы превратиться в зомби, он вообще не говорит почему.
Я спланировал свою программу (которая является моей первой многопоточной программой, извините за мою наивность) вокруг цикла for (;;)
, который запускается дочерние процессы, которые удаляют exec ()
и обязательно завершаются сами по себе.
Я не могу использовать wait (NULL)
, потому что это делает невозможным параллельное вычисление, поэтому я ' Вероятно, мне придется добавить таблицу процессов, в которой хранятся дочерние идентификаторы, и использовать waitpid
- не сразу, а по прошествии некоторого времени - что является проблемой, потому что время работы дочерних элементов варьируется от нескольких микросекунды до нескольких минут.Если я использую waitpid
слишком рано, мой родительский процесс будет заблокирован, когда я использую его слишком поздно, меня захватят зомби, и я больше не смогу fork ()
, что не только плохо для моего процесса, но может вызвать непредвиденные проблемы во всей системе.
Мне, вероятно, придется запрограммировать некоторую логику использования некоторого максимального количества потомков и заблокировать родителя, когда это число будет достигнуто - но в этом нет необходимости, потому что большинство потомков завершается быстро. Другое решение, которое я могу придумать (создание двухуровневого родительского процесса, который порождает параллельных потомков, которые, в свою очередь, одновременно порождаются и ждут
для внуков), сейчас для меня слишком сложно. Возможно, я также смогу найти неблокирующую функцию для проверки дочерних элементов и использовать waitpid
только после их завершения.
Тем не менее вопрос:
Почему Linux вообще держит зомби? Почему я должен ждать своих детей? Это для обеспечения дисциплины родительских процессов? За десятилетия использования Linux я так и не получил ничего полезного от зомби-процессов, я не совсем понимаю полезность зомби как «особенности».
Если ответ заключается в том, что родительские процессы должны иметь способ узнать, что случилось с их дочерними процессами, то, ради бога, нет причин считать зомби нормальными процессами и запрещать создание процессов, не связанных с зомби, только потому, что они слишком много зомби.В системе, которую я сейчас разрабатываю, я могу запустить от 400 до 500 процессов, прежде чем все остановится (это плохо обслуживаемая система CentOS, работающая на самом дешевом VServer, который я смог найти, но все же 400 зомби - это меньше, чем несколько килобайт информации. )