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

时间:2017-08-08 08:00:15

标签: c posix

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

len = read(fd, buf, 32);

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

2 个答案:

答案 0 :(得分:2)

read()尝试读取文件描述符fd中的字节数。

fd = 0
fd = 1
fd = 2

从不同的文件描述符中读取。区别在于,您正在读取不同的文件,并且读入缓冲区的数据不同。

阅读Book A和阅读Book B有何不同?这是读书的过程......内容会发生变化。

答案 1 :(得分:1)

据我了解你的问题,如果你从文件描述符0,1,2中读取,没有任何改变的原因。

在正常程序中,文件描述符0是stdin,1是stdout,2是stderr。 stdin是你应该阅读输入的地方,1是你应该写输出的地方,2是你应该写错误信息的地方。

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

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