2017-08-08 55 views
0

我有难与其理解read功能C.Çread()函数很难理解文件描述符

len = read(fd, buf, 32); 

当我给你fd为0,1,2和运行程序,它基本上做同样的事情,有人可以告诉我这有什么不同吗?

+0

你知道fd 0,1,2是什么意思吗? –

+2

“基本上做同样的事情” - 它在做什么?它是做你期望的吗? –

+0

他意思是我认为的文件描述符。 –

回答

1

据我理解你的问题是为什么,如果你从文件描述符0,1阅读没有什么变化,2

在正常程序中的文件描述符0是标准输入,1是标准输出和2是标准错误。 stdin是你应该读取输入的地方,1是你应该在哪里写输出,2是你应该写错误信息的地方。

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

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

2

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

fd = 0 
fd = 1 
fd = 2 

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

Book ABook B读数有什么不同?阅读一本书的过程是一样的......它的内容发生了变化。

+0

不同的文件描述符可能指的是同一个文件 –

+0

等待..如果即时通讯运行它的CMD,并要求输入,那么“书”是什么?对不起,我是一个新手在这个东西,我只做竞争性编程... –

+0

@眠りネロク真,但让我们假设它是不同的文件。 –