【发布时间】:2010-08-18 11:46:19
【问题描述】:
有人告诉我,每当运行 C++ 程序时,三个文件 STDIN、STDOUT 和 STDERR 都会打开,他提供了这个链接以示支持。
http://tldp.org/LDP/abs/html/io-redirection.html
但我很困惑这些流实际上是文件吗?
谁能澄清一下?
【问题讨论】:
-
您在提供的链接中看到注释 [1] 了吗?这实际上回答了你的问题。
有人告诉我,每当运行 C++ 程序时,三个文件 STDIN、STDOUT 和 STDERR 都会打开,他提供了这个链接以示支持。
http://tldp.org/LDP/abs/html/io-redirection.html
但我很困惑这些流实际上是文件吗?
谁能澄清一下?
【问题讨论】:
如果您在终端上输入man stdio,则概要如下所示
#include <stdio.h>
FILE *stdin;
FILE *stdout;
FILE *stderr;
所以它们确实是文件。
如果您询问这些文件是否真的存在于某个地方,请查看/dev/stdin、/dev/stdout 和/dev/stderr。
【讨论】:
'man' is not recognized as an internal or external command, operable program or batch file.不知道这哥们用的是哪个系统。
Like。这是系统特定的天气,它们实际上作为文件系统上的文件存在。但就您的代码而言,它们是文件。
CONIN$ 或 CONOUT$(stderr 也转到 CONOUT$)。由于它们实际上不是磁盘上的文件,因此它们不在您的 C: 驱动器上。与您的打印机端口相同,LPT1 也不在 C: 上。
在 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。
【讨论】:
GetStdHandle(STD_OUTPUT_HANDLE); 获得的句柄,这也有效
它们的类型为FILE*。它们可以像具有 IO 功能的文件一样使用。但它们不是“真正的”文件——它们是标准的 IO 流。当你在你的 shell 中做这样的事情时(例如 linux):
cat something.txt | myprog
...然后 myprog 可以通过从 STDIN 读取来读取 something.txt(cat 程序的输出)的内容。
【讨论】: