是stdin,stdout和stderr文件吗?

时间:2010-08-18 11:46:20

标签: c++ stream

有人告诉我,无论何时运行C ++程序,都会打开三个文件STDIN,STDOUT和STDERR,并在他的支持下给出了这个链接。

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

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

任何人都可以澄清吗?

3 个答案:

答案 0 :(得分:3)

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

#include <stdio.h>

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

所以他们真的是文件。

如果您询问这些文件是否确实存在于某处,请查看/dev/stdin/dev/stdout/dev/stderr

答案 1 :(得分:2)

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

cat something.txt | myprog

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

答案 2 :(得分:2)

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

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

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