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