我应该总是显式地关闭stdout吗?
Should I always close stdout explicitly?
我正在尝试集成一个小型的Win32 c++程序,该程序从stdin读取并将解码结果(~ 128 kb)写入输出流。
我用
将整个输入读入缓冲区while (std::cin.get(c)) { }
将整个输出写入标准输出后。
当我从命令行运行应用程序(例如test.exe < input.bin > output.bin
)时,一切都很好,但是这个小应用程序应该从Python运行。
我期望Python subprocess.communicate
应该被使用,文档说:
与进程交互:发送数据到stdin。从标准输出和中读取数据标准错误,直到到达文件结束。等待进程终止
所以communicate()
将等待直到文件结束之前等待我的应用程序完成- EOF应该发生当我的应用程序退出?还是应该显式地执行fclose(stderr)和fclose(stdout)?
不要关闭stdout
在一般情况下,这实际上是错误的,因为有可能向atexit()
注册一个试图写入标准输出的函数,如果标准输出关闭,这将中断。
当进程终止时,操作系统将自动关闭所有句柄。这包括标准输出,所以您不负责手动关闭它。
(从技术上讲,c++运行时通常会在操作系统有机会参与之前尝试刷新和关闭所有c++流,但操作系统绝对必须关闭运行时由于任何原因错过的任何句柄)
在特殊情况下,关闭标准流可能是有用的(例如,在执行守护进程时),但应该非常小心。重定向到空设备(Unix上的/dev/null
, Windows上的nul
)通常是一个好主意,这样期望与这些流交互的代码仍然可以工作。在Unix上,这是用freopen(3)
完成的;Windows有一个等效的功能,但它是POSIX API的一部分,可能不能很好地与标准的Windows I/o一起工作。
- 我应该使用什么来代替void作为变体中的替代类型之一
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 我应该删除矢量<short>吗?
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 我应该在锁定TBitmap画布后解锁它吗
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 我应该避免多重实现继承吗
- 为了方便起见,我应该避免公开私有字段变量吗
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 违反const正确性:我应该现实地期待什么问题
- 我应该如何表示我拥有的连续元素序列?
- 我应该将除 .cpp 以外的其他文件添加到 git 中吗?
- 我应该如何从 stdin C++ 中读取可变长度的格式字符串?
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我应该如何捕捉out_of_range异常?
- 我应该声明所有不抛出 noexexcept 的成员/函数吗?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我应该总是显式地关闭stdout吗?