我正在尝试集成一个小的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)?
答案 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配合使用。