如何关闭cerr

时间:2012-02-13 11:54:40

标签: c++ posix

是的,我不能。似乎奇怪的ostream没有关闭,因为istream可以检测文件的结尾。

这是我的情况:我正在捕获Posix fd2上的所有输出,在这个过程中,它的子节点,通过创建一个管道并将管道输出端复制到fd2上。然后,线程使用关联的C流读取管道的读取端(并且恰好通过另一个关联的C流将每个行写入原始fd2的时间戳)。

当所有的孩子都死了,我给cerr写了一条收到的消息,然后我需要关闭它,这样回线到原始错误文件的线程将关闭管道并终止。

即使我关闭了stderr和fd2,线程也没有检测到eof()。

我使用一个简单的程序复制我的主程序,并使用C流而不是C ++ iostreams,并且通过fclosing stderr一切正常(虽然在那个简化的测试中没有子进程)。

编辑:嗯..在将它复制到通道2后,是否需要关闭原始管道fd?我没有这样做,因此底层管道仍然附有一个开放的fd。啊哈......那就是答案!

3 个答案:

答案 0 :(得分:1)

用于标准C ++流的流与由相应的stdio文件控制的流相同。也就是说,如果您fclose(stderr),您还会关闭用于std::cerr的流。 ...并且由于您似乎使用了各种dup()函数,因此您还可以close(2)关闭此流。

答案 1 :(得分:1)

使用dup2复制文件描述符时,原始描述符仍然是对基础文件的有效引用。在关闭与特定文件关联的所有文件描述符(使用close)之前,不会关闭该文件并释放相关资源。

如果您使用dup2将文件描述符复制到众所周知的数字(例如stderr的2),您通常希望立即在原始文件描述符上调用close成功dup2之后。

答案 2 :(得分:0)

最好是在资源周围放置一个包装器,然后让析构函数在超出范围时关闭它。来自Bjarne Stoustup的作品