【问题标题】:Are stdin, stdout, and stderr Files?是标准输入、标准输出和标准错误文件吗?
【发布时间】:2010-08-18 11:46:19
【问题描述】:

有人告诉我,每当运行 C++ 程序时,三个文件 STDIN、STDOUT 和 STDERR 都会打开,他提供了这个链接以示支持。

http://tldp.org/LDP/abs/html/io-redirection.html

但我很困惑这些流实际上是文件吗?

谁能澄清一下?

【问题讨论】:

  • 您在提供的链接中看到注释 [1] 了吗?这实际上回答了你的问题。

标签: c++ stream


【解决方案1】:

如果您在终端上输入man stdio,则概要如下所示

#include <stdio.h>

 FILE *stdin;
 FILE *stdout;
 FILE *stderr;

所以它们确实是文件。

如果您询问这些文件是否真的存在于某个地方,请查看/dev/stdin/dev/stdout/dev/stderr

【讨论】:

  • 这些文件夹在 Windows 系统上的位置?
  • @Shubham Touché :-) 我已经有 10 年没用过窗户了,所以我真的不知道。
  • 在windows终端输入“man stdio”会导致'man' is not recognized as an internal or external command, operable program or batch file.不知道这哥们用的是哪个系统。
  • 他们是文件Like。这是系统特定的天气,它们实际上作为文件系统上的文件存在。但就您的代码而言,它们是文件。
  • 在 Windows 上,它们是 CONIN$CONOUT$(stderr 也转到 CONOUT$)。由于它们实际上不是磁盘上的文件,因此它们不在您的 C: 驱动器上。与您的打印机端口相同,LPT1 也不在 C: 上。
【解决方案2】:

在 POSIX 系统上,流是特殊的文件描述符。 Windows 有它自己的 err.. 东西,但它们也是那里的文件描述符。 Windows 上的特殊文件的示例是标准流 stdout、stdin 和 stderr,以及可以使用 OpenFile() 打开的 COMn 等串行端口。在 Linux 上,特殊文件位于 /proc 和 /dev 下。 /proc/cpuinfo 将读回有关您的 CPU 的信息。 /dev/sdX 是物理磁盘等的句柄。

那么什么是特殊文件?它是一个文件句柄,但内容不存储在磁盘上。文件句柄只是内核的一个接口。在 POSIX 系统上,您使用 open()、close()、read()、write() 和 ioctl() 通过文件描述符与内核通信。在 /dev/mem 下甚至可以使用整个内存映射的文件描述符。例如,如果你想映射一个内存区域,你可以打开它并传递给 mmap()。

很遗憾,Microsoft Windows 不处理此级别的文件描述符。我希望 Windows 更像 POSIX。

【讨论】:

  • Windows Handles 的工作方式与此非常相似。您使用 WriteFile(HANDLE output) 写入句柄。即使它是您从 GetStdHandle(STD_OUTPUT_HANDLE); 获得的句柄,这也有效
【解决方案3】:

它们的类型为FILE*。它们可以像具有 IO 功能的文件一样使用。但它们不是“真正的”文件——它们是标准的 IO 流。当你在你的 shell 中做这样的事情时(例如 linux):

cat something.txt | myprog

...然后 myprog 可以通过从 STDIN 读取来读取 something.txt(cat 程序的输出)的内容。

【讨论】: