首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >select()和fcntl()

select()和fcntl()
EN

Stack Overflow用户
提问于 2017-11-07 06:12:07
回答 1查看 896关注 0票数 3

按照我的理解-我们可以使用fctnl将文件描述符标记为非阻塞的,所以每当我们调用该文件描述符上的任何阻塞操作时,它都会错误地修改errno,以指示文件描述符尚未准备好。我们有责任经常轮询文件描述符,并随时读取或写入文件。

使用select,我们传入文件描述符的三个数组(读、写和除),然后select在给定的时间间隔内轮询文件描述符,修改数组以指示哪些文件描述符可用于指定的操作。而select本身就是一个阻塞操作。

现在我的怀疑是:

  1. 比方说,我对一个需要读取的数组文件描述符调用select,并在没有检测到任何事件的情况下超时。现在,如果我对一个文件描述符调用read,它会阻塞还是返回E_WOULDBLOCK / E_AGAIN,即使我没有首先使用fcntl
  2. 我调用超时值为10的select,只检查单个文件描述符。并且几乎可以立即在文件描述符上读取数据。在这种情况下,会选择静止块10秒吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-07 06:39:34

  1. 如果select()超时,但是要读取一个尚未准备好的阻塞文件描述符,那么您将阻塞。对select()的调用根本不影响文件描述符的行为。
  2. 如果数据立即准备就绪,select()调用将立即返回。如果数据在1秒后准备就绪,select()调用将在1秒后返回。如果在这段时间内没有数据准备好(或者数据是在超时发生之前一点点到达的话),它只会在10秒后返回。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47151098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档