我应该总是显式地关闭stdout吗?

Should I always close stdout explicitly?

本文关键字:stdout 我应该      更新时间:2023-10-16

我正在尝试集成一个小型的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一起工作。