是的,我不能。 ostream 没有关闭似乎很奇怪,因为 istream 可以检测到文件结尾。
这是我的情况:我正在捕获 Posix fd2 上的所有输出,在此过程中,以及它的子进程中,通过创建一个管道并将管道输出端 dup2'ing 到 fd2。然后一个线程使用关联的 C 流读取管道的读取端(并且碰巧通过另一个关联的 C 流将带有时间戳的每一行写入原始 fd2)。
当所有 child 都死了,我写了一条关闭消息给 cerr,然后我需要关闭它,这样将它回显到原始错误文件的线程将关闭管道并终止。
即使我关闭了 stderr 和 fd2,线程也没有检测到 eof()。
我使用一个简单的程序复制了我的主程序,并使用 C 流而不是 C++ iostream,并且通过关闭 stderr 一切正常(尽管在该简化测试中没有子进程)。
编辑:嗯.. 在 dup2'ing 到 channel 2 后我需要关闭原始管道 fd 吗?我没有那样做,所以底层管道仍然连接着一个打开的 fd。啊哈..这就是答案!
最佳答案
当您使用 dup2
复制文件描述符时,原始描述符仍然是对基础文件的有效引用。在关闭与特定文件关联的所有文件描述符(使用 close
)之前,不会关闭文件并释放关联的资源。
如果您正在使用 dup2
将文件描述符复制到一个众所周知的数字(例如 2 表示 stderr
),您通常需要调用 close
在成功的 dup2
之后立即在原始文件描述符上。
关于c++ - 如何关闭cerr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9260060/