c++ - 如何关闭cerr

标签 c++ posix

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

相关文章:

c++ - 转换标准 :vector to NSArray

c - 结构中的 "s"是什么意思?

c++ - 使用移动赋值从算术运算符重载返回 const 值

c - 如何使用 POSIX 线程在 C 语言中创建特定于线程的全局变量?

c++ - 关于碰撞安全和容错编程的资源

c - POSIX 信号量和 pthread 问题

c - 基本 C mkstemp 代码中的段错误

c++ - 概念检查器无法在 gcc 上编译,因为它是 'has no linkage'

c# - 与 C# 相比,C++ 中的构造函数和析构函数

c++ - 使用 gcc 写入 Unions