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

时间:2015-08-14 16:07:48

标签: python c++ windows pipe subprocess

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

我用

将整个输入读入缓冲区
while (std::cin.get(c)) { }

将整个输出写入标准输出后。

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

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

  

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

所以communicate()会在等待我的应用程序完成之前等到文件结尾 - 当我的应用程序退出时EOF应该会发生吗?或者我应该明确地做fclose(stderr)和fclose(stdout)?

1 个答案:

答案 0 :(得分:9)

不要关闭标准输出

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

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

(从技术上讲,在操作系统甚至有机会参与之前,C ++运行时将normally尝试刷新并关闭所有C ++流,但操作系统绝对必须关闭任何句柄whatever reason的运行时遗漏。)

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