什么时候可以读取文件描述符了?

时间:2019-01-08 22:39:16

标签: linux io

我是Linux的初学者,仍然在理解文件描述符和读取文件方面仍处于挣扎中。 我的课本说:

“当且仅当从该描述符读取1个字节的请求不会阻塞时,描述符k才可以读取”

比方说一个磁盘文件有20个字节,我刚打开该文件并准备读取它,所以它有一个文件描述符(假设fd为3)。那么在什么情况下该文件描述符没有1个字节可读取?就像我在第一次读取时读取20个字节,然后尝试再读取20个字节会阻塞吗?谁能给我这个例子的场景。谢谢

2 个答案:

答案 0 :(得分:0)

磁盘文件始终准备就绪,不会阻塞。当您打开文件时,它将准备就绪,您将读取20个字节。之后,您将阅读EOF(由read()返回长度0表示)。

“准备读取”的概念适用于异步设备,例如终端和网络套接字。在用户键入某些内容之前(如果该终端处于正常的“烹饪”模式,则使用Enter或EOF按键发送该终端时),该终端将无法读取。从远程计算机接收到数据后,即可读取网络套接字。

答案 1 :(得分:0)

与Java中常见的"blocking calls"相比,“经典” Linux文件I / O使用"Asynchronous I/O"。这意味着,如果您要“读取”或“写入”某些内容,则该程序将“阻塞”直到I / O操作完成。

如果您只想“阅读”一件事,这很好用。如果您想阅读几个中的任何不同内容,它不会起作用。例如,如果您有一个“事件”循环等待任何鼠标,键盘或窗口事件。

我相信您的教科书正在谈论select()函数,该函数允许一个函数阻塞,直到一个或多个输入可用数据为止。

这实际上不是关于“此磁盘文件有一个字节还是二十个字节?”相反,使用“选择”允许一个人“复用”多个并发输入。

您可能还会发现这篇文章很有帮助:

Linux – IO Multiplexing – Select vs Poll vs Epoll