Первый проход: до того, как стало ясно, что существует цикл с использованием select()
и что дети отправили несколько сообщений.
Если родительский процесс поддерживает массив файловых дескрипторов, ему также необходимо связать каждый файловый дескриптор с дочерним процессом. Если дети отправляют одно небольшое статистическое сообщение перед своей смертью, то, когда основная программа ожидает мертвых детей, она знает, какой ребенок умер, поэтому она может затем закрыть файловый дескриптор для ребенка, который только что обнаружил умирающий (после того, как убедится, что pipe пуст, выполнив одно или несколько окончательных чтений).
Альтернативный механизм использует select()
или _ 3_ или связанная функция, которая сообщает, когда операция чтения файлового дескриптора не зависает. Когда он обнаруживает EOF (чтение нулевых байтов) из канала, он знает, что ребенок умер. Однако с этим, вероятно, сложнее иметь дело.
Из вашего вопроса не совсем ясно, есть ли одно сообщение от дочернего процесса при его выходе или есть статистические отчеты «поток сознания», когда ребенок работает. Если есть одно сообщение (меньше размера буфера канала), тогда жизнь проста. Если есть поток сообщений или сообщение длиннее, чем размер буфера канала, вам нужно более тщательно подумать о координации - вы не можете обнаружить сообщения только тогда, когда дочерний элемент умирает.
Второй проход: после того, как стала доступна дополнительная информация.
Если вы уже используете select()
в цикле, тогда, когда дочерний элемент умирает, вы получите индикацию «канал готов к чтению» от select()
, и вы получите 0 байтов от read()
, что указывает на EOF на этом канале. Затем вы должны закрыть этот канал (и дождаться одного или нескольких дочерних элементов с _7 _, вероятно, используя W_NOHANG
- должен быть хотя бы один труп, который нужно собрать - чтобы у вас не было зомби, слоняющихся вокруг в течение длительного времени).
Строгий ответ на ваш последний вопрос: когда умирает единственный дочерний элемент с концом записи канала, родитель должен закрыть конец чтения этого канала, чтобы освободить ресурсы для последующего повторного использования.
person
Jonathan Leffler
schedule
16.05.2014