【问题标题】:Are Standard Streams files stored in a disk?标准流文件是否存储在磁盘中?
【发布时间】: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 引用 C stdout,它在 Windows 上引用低 I/O STDOUT,它引用 StandardOutput。 Python 3 不使用 C 标准 I/O。它在 POSIX 层之上有自己的文本、缓冲区和原始流层次结构。

标签: python linux windows


【解决方案1】:

它们被称为流而不是文件是有原因的:它们代表数据的源或汇。有时发送到流的数据存储在磁盘中的文件中,但有时数据只是由另一个程序接收。

例如,当您将两个命令连接在一起时:

$ ls | sort

第一个命令的标准输出连接到第二个命令的标准输入。

关于标准流在简单外壳中连接的位置,标准流连接到虚拟终端程序。在 linux 中,它将是程序 shell(xterm、gnome-terminal、kdeterminal...)。在 Windows 中,它将是控制台管理器,由操作系统模块直接创建(通常为 csrss.exe,但 Windows 版本之间的详细信息有所不同)。

然后,当您写入标准输出时,写入的字符会显示在屏幕上,当您从标准输入读取时,终端会等待键盘输入。

【讨论】:

  • 在 Windows 7+ 中,它是 conhost.exe 的单独实例,而不是 csrss.exe 系统进程。在 Windows 8+ 中,部分工作也由 condrv.sys 内核设备驱动程序处理。
  • 流到底是什么意思?在这方面我并不是很先进。
  • @direprobs:stream 是一个对象(抽象),它代表您可以从中读取数据或向其写入数据的东西。流有很多种:文件、套接字、管道、fifos、控制台……一般的想法是,无论哪种类型,您都使用或多或少相同的函数来写入/读取流。您可以将 stream 视为一般 file 的同义词。在 Python(或其他任何地方)中使用 file 一词时,有时您指的是任何类型的 stream,而不是专门的文件系统文件。
  • @rodrigo 所以基本上,例如,当我打开 cmd.exe 时,会为(连接到)窗口创建三个流?
  • @direprobs:是的,就是这样。当您从该命令窗口运行控制台程序时,新程序将继承这三个流的句柄并与父 cmd 共享它们。
【解决方案2】:

Python 中的file 是文件描述符的抽象,它只是处理文件和流(以及 *nix 上的其他事物)的一种低级方式。这绝不意味着磁盘上有任何内容。

此外,Windows 应用程序默认没有可用的标准流;应用程序必须显式打开它们才能使它们可用。

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2012-01-20
    • 2017-04-28
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多