【发布时间】:2016-04-17 19:06:52
【问题描述】:
来自维基百科:
在计算机编程中,标准流是计算机程序开始执行时与其环境之间预先连接的输入和输出通信通道。这三个 I/O 连接称为标准输入 (stdin)、标准输出 (stdout) 和标准错误 (stderr)。最初 I/O 是通过物理连接的系统控制台(通过键盘输入,通过监视器输出)发生的,但标准流对此进行了抽象。”
正如我从 wiki 中了解到的,标准输入传统上是键盘,标准输出是显示器(输出)。但是今天这些是什么,因为大多数现代计算机都使用 GUI。例如,如果我打开 Linux Shell 的 cmd.exe 或其他任何东西,然后使用以下命令运行 Python:
# In cmd.exe
>>> import sys
>>> sys.stdout
<open file '<stdout>', mode 'w' at 0x000000000224B0C0>
A) 我注意到sys.stdout 是内存中的一个文件(对象),它只是Python 解释器创建的一个对象吗?还是sys.stdout 物理存储在硬盘驱动器或任何存储方式中?
B) 我认为 cmd.exe 是一个 Win32 应用程序,所以它有 stdin、stdout 或 stderr,如果有,它们在哪里?它们只是存储在内存中吗?
【问题讨论】:
-
一个 Windows 进程有 3 个标准句柄,您可以通过
GetStdHandle和SetStdHandle获取和修改它们。这些在内部设置过程参数StandardInput、StandardOutput和StandardError句柄。在 Windows 8+ 中,控制台处理与控制台主机进程 conhost.exe 对话的ConDrv设备的引用内核File对象,并且通信使用标准 I/O 系统调用(NtWriteFile等)。在 Windows 8 之前,它们不是内核句柄,而是由控制台本身管理的特殊标记的控制台句柄(低 2 位设置),通信使用 LPC 系统调用。 -
请注意,Windows 不在系统级别使用 POSIX 文件描述符,特殊文件 0 (
STDIN)、1 (STDOUT) 和 2 (STDERR)。相反,这些是由将 Windows 句柄映射到 POSIX 文件描述符的 C 运行时低 I/O 层提供的。进程中的每个 CRT(通常有 2 个或更多)都维护自己的映射,这对于使用 MinGW 构建的 Python 扩展模块来说是一个问题,这些模块与 msvcrt.dll 而不是 python.exe 使用的 CRT 链接。 -
还要注意 Python 2 使用 C
FILE流。因此,例如,sys.stdout引用 Cstdout,它在 Windows 上引用低 I/OSTDOUT,它引用StandardOutput。 Python 3 不使用 C 标准 I/O。它在 POSIX 层之上有自己的文本、缓冲区和原始流层次结构。