Unix: What are stdin/out/err REALLY?



假设以下内容正确。。。

  1. stdin、stdout和stderr是流
  2. 流是文件描述符
  3. 文件描述符是内核中表示打开文件的数字/索引

问题:

a。stdin/out/err是否包含打开的文件?那么,如果我执行ls /dirls是否将结果输出到stdout(2)引用的文件
b.上述文件住在哪里?在/proc//中?还是FD住在那里
c.什么是/dev/stdout?如果我做vim /dev/stdout,vim告诉我它不是一个文件。我看到有一系列链接指向/dev/pts/27。发生了什么事?我试着cat /dev/stdout,但什么也没发生
d.一般来说,linux中的"文件"实际上不是文件是怎么回事?

您的一些假设是不正确的。例如,stdin的类型为FILE*;它不是"文件描述符"。

stdinstdoutstderr是在<stdio.h>中定义的宏。(是的,它们必须是宏,而不仅仅是变量名)。它们扩展为FILE*类型的表达式,并指向与标准输入、输出和错误流相关联的FILE对象。

"文件描述符"是一个表示POSIX流的小整数值。在类UNIX系统上,FILE*值通常与文件描述符相关联(可以使用filenofdopen函数从一个到另一个),但它们不是一回事。

基本上,有两个不同的I/O系统,一个构建在另一个之上。下层系统使用数字文件描述符,通过openreadwriteclose函数等进行操作。由ISO C标准定义的更高级别使用类型为FILE*的指针,用fopenfreadfwritefprintfputcharfclose等进行操作。

正如我提到的,在类UNIX系统上,C标准层通常是在POSIX层之上实现的。在非POSIX系统(如MS Windows)上,C标准层可以在其他特定于系统的接口之上实现。

Linux和其他类似UNIX的系统试图(不完全)遵循"一切都是文件"的哲学。/proc下有许多类似文件的实体。这些不是存储在磁盘上的物理文件;它们是可以使用POSIX或ISOC I/O层访问的实体。这两层都不要求它处理的"文件"是实际的磁盘文件,所以这并没有什么不一致的地方。

man proc获取有关/proc目录下内容的更多信息(其中的详细信息远远超出了我的回答范围)。

相关内容

  • 没有找到相关文章

最新更新