У меня есть следующий сценарий.
Я создаю трубу.
Разветвил дочерний процесс.
Ребенок закрывает конец канала для чтения явно и записывает в конец канала для записи и выходит, ничего не закрывая (выход должен закрыть все открытые дескрипторы файлов/каналов от имени ребенка, я полагаю ).
Parent закрывает конец записи канала явным образом и читает из конца канала чтения, используя fgets
, пока fgets
не вернет NULL. т.е. читается полностью.
Теперь мой вопрос: почему родитель должен явно закрывать конец канала для чтения после завершения чтения? Разве не разумно для системы полностью удалить канал после того, как полные данные будут прочитаны с конца чтения -?
Я не закрываю конец чтения явно в родительском элементе, и рано или поздно у меня возникает ошибка Too many file descriptors
при открытии большего количества каналов. Мое предположение состояло в том, что система автоматически удаляет канал, как только его конец записи закрыт, а данные полностью прочитаны из конца чтения. Потому что вы не можете из трубы дважды!
Итак, в чем причина того, что система не удаляет канал после того, как данные были полностью прочитаны, а конец записи закрыт?