如何关闭cerr

How to close cerr

本文关键字:cerr 何关闭      更新时间:2023-10-16

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

我的情况是:在这个过程中,我通过创建一个管道并将管道输出端dup2’ing到fd2上,捕获Posix fd2上的所有输出及其子级。然后,线程使用相关联的C流读取管道的读取端(并且碰巧通过另一个相关联的C流将具有时间戳的每一行写入原始fd2)。

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

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

我用一个简单的程序复制了我的主程序,用C流代替C++iostreams,通过fclosing stderr一切都很好(不过在简化的测试中没有子进程)。

编辑:嗯。。在将原始管道fd复制到通道2上后,我需要关闭它吗?我没有这么做,所以下面的管道仍然连接着一个打开的fd。啊哈。。这就是答案!

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

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

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

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