Я создаю службу TCP, которая разворачивает новый процесс каждый раз, когда клиент подключается. Перед вилкой я настраивал трубу, чтобы ребенок мог отправлять статистику, собранную во время соединения, обратно родителям. Родитель закрывает конец записи, а дочерний элемент закрывает конец чтения, а родитель поддерживает массив дескрипторов файлов для чтения, по одному на каждого ребенка.Как родительский дескриптор файла pipe закрывается при выходе дочернего процесса
Я не уверен, что делать с этими файловыми дескрипторами, когда ребенок заканчивается соединением и выходами. Требуется ли ребенку уведомить родителя через канал, который он собирается закрыть, чтобы родитель мог закрыть трубку? Или родитель может обнаружить разбитую трубу автоматически после того, как ребенок выйдет и закроет его?
Код в родительской программе работает с циклом, в котором select()
обнаруживает активность в гнезде для прослушивания и на концах чтения детских труб. Каждый ребенок может отправлять несколько сообщений родительскому элементу при его запуске.
В общем, что должен сделать родительский процесс с дескриптором файла трубы при выходе из него?
Я уже закрыл конец записи в родительском и читающем конце в дочернем. Вы говорите, что родительский 'read' будет сообщать EOF, когда ребенок вышел, и я могу его обнаружить таким образом? – Flash
Да; если ребенок умирает, 'read()' на трубе вернет 0, указывающий EOF. Если конец записи трубы открыт, считывание будет зависать до тех пор, пока не будут прочитаны данные или конец записи трубки закрыт. –
@Andrew: способ думать о файловом дескрипторе является указателем, отсчитываемым от ссылки, на уровень. 'dup2' копирует указатель, а' close' сбрасывает его. После того, как написание текста исчезло (потому что оно больше не упоминается), чтение с конца чтения вернет EOF. – tmyklebu