我正在尝试集成一个小型 Win32 C++ 程序,该程序从标准输入读取并将解码结果(~128 KB)写入输出流。
我用
将整个输入读入缓冲区while (std::cin.get(c)) { }
在我将整个输出写入标准输出之后。
当我从命令行运行应用程序时一切正常,例如 test.exe < input.bin > output.bin
,但是这个小应用程序应该从 Python 运行。
我希望 Python subprocess.communicate
应该使用,文档说:
Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate.
所以 communicate()
将等到文件结束后再等待我的应用程序完成 - EOF 应该在我的应用程序退出时发生吗?或者我应该明确地执行 fclose(stderr) 和 fclose(stdout) 吗?
最佳答案
不要关闭标准输出
在一般情况下,它实际上是错误的,因为可以用 atexit()
注册一个函数。它尝试写入 stdout,如果 stdout 关闭,这将中断。
当进程终止时,操作系统会自动关闭所有句柄。这包括标准输出,因此您无需手动关闭它。
(从技术上讲,C++ 运行时将 normally 尝试在操作系统有机会介入之前刷新并关闭所有 C++ 流,但操作系统绝对必须关闭运行时运行的任何句柄, 对于 whatever reason , 未命中。)
在特殊情况下,关闭标准流可能很有用(例如,在守护进程时),但应该非常小心。重定向到空设备(/dev/null
在 Unix 上,nul
在 Windows 上)通常是一个好主意,这样期望与这些流交互的代码仍然会工作。在 Unix 上,这是通过 freopen(3)
完成的。 ; Windows 有 an equivalent function ,但它是 POSIX API 的一部分,可能不适用于标准 Windows I/O。
关于python - 我应该始终明确关闭标准输出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32014310/