我应该总是明确关闭stdout吗?

Bor*_*hov 2 c++ python windows subprocess pipe

我正在尝试集成一个从stdin读取的小型Win32 C++程序,并将解码结果(〜128 kbytes)写入输出流.

我把整个输入读入缓冲区

while (std::cin.get(c)) { }
Run Code Online (Sandbox Code Playgroud)

将整个输出写入stdout后.

当我从命令行运行应用程序时,一切正常test.exe < input.bin > output.bin,但是这个小应用程序应该从Python运行.

我希望Python subprocess.communicate应该被使用,文档说:

与流程交互:将数据发送到stdin.从stdout和stderr读取数据,直到达到文件结尾.等待进程终止.

因此communicate(),在等待我的应用程序完成之前,请等到文件结束 - 当我的应用程序退出时,是否应该发生EOF?或者我应该明确地做fclose(stderr)和fclose(stdout)吗?

Kev*_*vin 9

不要关闭stdout

在一般情况下,它实际上是错误的,因为可以注册一个atexit()尝试写入stdout 的函数,如果stdout关闭,这将会中断.

当进程终止时,操作系统会自动关闭所有句柄.这包括stdout,因此您不负责手动关闭它.

(从技术上讲,C++运行时通常会尝试在操作系统甚至有机会参与之前刷新和关闭所有C++流,但操作系统绝对必须关闭运行时,无论 出于何种原因,都会错过的任何句柄.)

在特殊情况下,关闭标准流(例如,守护进程时)可能很有用,但应该非常谨慎地完成.重定向到null设备(/dev/null在Unix上,nul在Windows上)通常是一个好主意,这样期望与这些流交互的代码仍然可以工作.在Unix上,这是完成的freopen(3); Windows具有相同的功能,但它是POSIX API的一部分,可能无法与标准Windows I/O一起使用.