是的,我不能。似乎奇怪的ostream没有关闭,因为istream可以检测文件的结尾。
这是我的情况:我正在捕获Posix fd2上的所有输出,在这个过程中,它的子节点,通过创建一个管道并将管道输出端复制到fd2上。然后,线程使用关联的C流读取管道的读取端(并且恰好通过另一个关联的C流将每个行写入原始fd2的时间戳)。
当所有的孩子都死了,我给cerr写了一条收到的消息,然后我需要关闭它,这样回线到原始错误文件的线程将关闭管道并终止。
即使我关闭了stderr和fd2,线程也没有检测到eof()。
我使用一个简单的程序复制我的主程序,并使用C流而不是C ++ iostreams,并且通过fclosing stderr一切正常(虽然在那个简化的测试中没有子进程)。
编辑:嗯..在将它复制到通道2后,是否需要关闭原始管道fd?我没有这样做,因此底层管道仍然附有一个开放的fd。啊哈......那就是答案!
答案 0 :(得分:1)
用于标准C ++流的流与由相应的stdio文件控制的流相同。也就是说,如果您fclose(stderr)
,您还会关闭用于std::cerr
的流。 ...并且由于您似乎使用了各种dup()
函数,因此您还可以close(2)
关闭此流。
答案 1 :(得分:1)
使用dup2
复制文件描述符时,原始描述符仍然是对基础文件的有效引用。在关闭与特定文件关联的所有文件描述符(使用close
)之前,不会关闭该文件并释放相关资源。
如果您使用dup2
将文件描述符复制到众所周知的数字(例如stderr
的2),您通常希望立即在原始文件描述符上调用close
成功dup2
之后。
答案 2 :(得分:0)
最好是在资源周围放置一个包装器,然后让析构函数在超出范围时关闭它。来自Bjarne Stoustup的作品