gpt4 book ai didi

c++ - 如何关闭cerr

转载 作者:行者123 更新时间:2023-11-28 03:41:01 24 4
gpt4 key购买 nike

是的,我不能。 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com