Да, я не могу. Кажется, что странный ostream не закрывается, поскольку istream может обнаружить конец файла.
Вот моя ситуация: я собираю все выходные данные Posix fd2, в этом процессе и его дочерние элементы, создавая канал и дублируя выходной конец канала на fd2. Затем поток читает конец чтения канала, используя связанный поток C (и случается, что записывает каждую строку с отметкой времени в исходное fd2 через другой связанный поток C).
Когда все дочерние элементы мертвы, я пишу закрывающее сообщение в cerr, затем мне нужно закрыть его, чтобы поток, отображающий его в исходный файл ошибок, закрыл канал и завершил работу.
Поток не обнаруживает eof (), хотя я закрываю как stderr, так и fd2.
Я продублировал мою основную программу, используя простую и использующую потоки C вместо C ++ iostreams, и все прекрасно работает благодаря fclosing stderr (хотя в этом упрощенном тесте нет дочерних процессов).
Редактировать: хм .. мне нужно закрыть оригинальный канал fd после того, как dup2'ing его на канал 2? Я этого не делал, поэтому к основной трубе все еще прикреплен открытый файл. Ага .. вот и ответ!