如何关闭cerr
How to close cerr
是的,我不能。因为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 的介绍
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 关闭||运算符优化
- C++在变量给定的指定时间内关闭电脑
- Python中的for循环与C++有何不同
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 确保流程关闭
- Qt Q串行端口未编程设备未关闭
- 如何正确关闭升压线程
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 我的二进制搜索程序只是关闭了
- 在C++中释放内存期间,迭代器与指针有何不同
- 在不知道套接字的情况下关闭网络连接
- 防止组合框被关闭
- 按回车键后输出屏幕关闭
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 通过安装信号处理程序关闭多线程应用程序
- 自定义对话框(源自QDialog)不会关闭(Android)
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 有没有办法打开/关闭标准:cerr(或同等的)
- 如何关闭cerr