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