假设以下内容正确。。。
- stdin、stdout和stderr是流
- 流是文件描述符
- 文件描述符是内核中表示打开文件的数字/索引
问题:
a。stdin/out/err是否包含打开的文件?那么,如果我执行ls /dir
,ls
是否将结果输出到stdout(2)引用的文件
b.上述文件住在哪里?在/proc//中?还是FD住在那里
c.什么是/dev/stdout?如果我做vim /dev/stdout
,vim告诉我它不是一个文件。我看到有一系列链接指向/dev/pts/27
。发生了什么事?我试着cat /dev/stdout
,但什么也没发生
d.一般来说,linux中的"文件"实际上不是文件是怎么回事?
您的一些假设是不正确的。例如,stdin
的类型为FILE*
;它不是"文件描述符"。
stdin
、stdout
和stderr
是在<stdio.h>
中定义的宏。(是的,它们必须是宏,而不仅仅是变量名)。它们扩展为FILE*
类型的表达式,并指向与标准输入、输出和错误流相关联的FILE
对象。
"文件描述符"是一个表示POSIX流的小整数值。在类UNIX系统上,FILE*
值通常与文件描述符相关联(可以使用fileno
和fdopen
函数从一个到另一个),但它们不是一回事。
基本上,有两个不同的I/O系统,一个构建在另一个之上。下层系统使用数字文件描述符,通过open
、read
、write
和close
函数等进行操作。由ISO C标准定义的更高级别使用类型为FILE*
的指针,用fopen
、fread
、fwrite
、fprintf
、putchar
、fclose
等进行操作。
正如我提到的,在类UNIX系统上,C标准层通常是在POSIX层之上实现的。在非POSIX系统(如MS Windows)上,C标准层可以在其他特定于系统的接口之上实现。
Linux和其他类似UNIX的系统试图(不完全)遵循"一切都是文件"的哲学。/proc
下有许多类似文件的实体。这些不是存储在磁盘上的物理文件;它们是可以使用POSIX或ISOC I/O层访问的实体。这两层都不要求它处理的"文件"是实际的磁盘文件,所以这并没有什么不一致的地方。
man proc
获取有关/proc
目录下内容的更多信息(其中的详细信息远远超出了我的回答范围)。