【问题标题】:file descriptor unable to read 1 byte文件描述符无法读取 1 个字节
【发布时间】:2019-01-08 06:37:46
【问题描述】:

我是Unix/Linux的初学者,只是一个关于文件描述符的问题,我的教科书问一个问题:

在大多数 Unix 系统中,键入 ctrl-d 表示标准输入上的 EOF。什么 如果您在图 12.6 中的程序(只是一个使用 select() 的程序)中键入 ctrl-d 会发生这种情况,而它在调用 select 时被阻塞?

答案是:

如果从该描述符读取 1 个字节的请求不会阻塞,则该描述符已准备好读取。如果 EOF 在描述符上变为真,则描述符已准备好读取,因为读取操作将立即返回零返回代码,指示 EOF。因此,键入 ctrl-d 会导致选择函数返回就绪集中的描述符 0。

所以我的问题:

为什么在我们按下 ctrl-d 之前文件描述符无法读取 1 个字节?

【问题讨论】:

标签: linux io


【解决方案1】:

select 阻塞,直到至少有一个文件描述符可以从其 fd_set 中读取。在按下 CTRL-d 之前没有要读取的字节。按下 CTRL-d 后,标准输入被关闭,当这种情况发生时,EOF 字节就可以从标准输入的缓冲区中读取。

【讨论】:

  • 那么在什么情况下从该描述符读取至少 1 个字节的请求会阻塞?
  • 如果您尝试从没有任何字节可读取的文件描述符中读取,那么它将阻塞。如果它有一个或多个字节可供读取,则不会阻塞。
  • 对不起,我还是不明白,我一定误解了一些基本概念。假设一个磁盘文件有 20 个字节,我刚刚打开这个文件并准备读取它,它有一个文件描述符,假设它的 fd 是 4。那么这个文件描述符怎么可能没有任何字节要读取呢?你能给我一个这个例子的场景吗,谢谢
  • 那么在这种情况下,文件描述符将对应于具有可读取字节的文件。在此文件描述符上调用 select 不会阻塞,因为该文件有可供读取的字节。如果程序随后读取文件的所有字节,那么它将达到 EOF 并且不再有任何字节可供读取。在此之后调用select 将永远阻塞。在您最初的帖子中,文件描述符指的是stdin。当程序启动时,stdin 没有可读取的字节,直到用户发送一些输入或使用 ctrl-d 关闭 stdin
  • 啊,好的,我们正在讨论您困惑的主要部分。如果文件描述符被关闭,或者如果我们已经到达文件的末尾,从文件描述符中读取总是会立即返回 EOF 而不会阻塞。您可以永远重复阅读 EOF。因此select 不会阻塞,因为从文件描述符读取不会阻塞。我意识到我在上一条评论中是不正确的。我说如果文件描述符达到 EOF,select 将永远阻塞。实际上恰恰相反。 select 如果用于已达到 EOF 的文件描述符,则永远不会阻塞。
猜你喜欢
  • 1970-01-01
  • 2016-05-08
  • 2011-10-02
  • 2017-02-12
  • 2011-07-03
  • 2017-08-20
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
相关资源
最近更新 更多