C read()函数难理解文件描述符

C read() function difficulty understanding file descriptor

我很难理解 C 中的 read 函数。

len = read(fd, buf, 32);

当我将 fd 分配为 0,1,2 和 运行 程序时,它基本上做同样的事情,有人能告诉我这有什么区别吗?

read() 尝试从文件描述符 fd 中读取最多 count 个字节。

fd = 0
fd = 1
fd = 2

正在从不同的文件描述符读取。不同的是,你是从不同的文件读取,读入缓冲区的数据是不同的。

阅读 Book A 和阅读 Book B 有什么区别?读一本书的过程是一样的……只是内容变了。

据我了解你的问题是为什么如果你从文件描述符 0、1、2 读取没有任何变化。

在普通程序中,文件描述符 0 是标准输入,1 是标准输出,2 是标准错误。 stdin 是您应该读取输入的位置,1 是您应该写入输出的位置,2 是您应该写入错误消息的位置。

所有三个文件描述符在幕后可能指向同一个底层文件(一个文件也可以是控制台、网络连接等)的情况并不少见。如果您只是 运行 从命令行运行您的程序,这实际上很有可能。在这种情况下,您可能能够读取所有这些内容并获得完全相同的结果。

但是。然后您决定要将程序的输出保存在一个文件中,运行 就像这样:program > output。现在文件描述符 1 不再指向与 stdin 相同的文件,您的程序将中断。如果您将 stderr 指向某个错误记录工具,也会发生同样的事情。或者从文件或管道获取输入。或者 运行 某些调试器中的程序。或不同的终端。这就是为什么你应该只从 0 而不是其他文件描述符读取,即使你有时可能会侥幸逃脱。