我理解它的方式 - 我们可以使用fctnl
将文件描述符标记为非阻塞,因此每当我们对该文件描述符调用任何阻塞操作时,它都会出错并修改errno
为表示文件描述符尚未准备好。我们有责任经常轮询文件描述符,并在准备就绪时进行读或写。
使用select
,我们传入文件描述符的三个数组(读取,写入和除外),然后select
轮询文件描述符一段给定的时间间隔,修改数组以指示哪些文件描述符可用于指定的操作。 select
本身就是一个阻止操作。
现在我怀疑是:
假设我在需要的数组文件描述符上调用select
被读取并且超时而没有检测到任何事件。现在,如果我打电话
read
在一个文件描述符上,它会阻塞还是会返回
E_WOULDBLOCK / E_AGAIN,即使我没有先使用fcntl
吗?
我调用超时为10秒的select来检查单个文件 描述。并且可以在文件上读取数据 描述符几乎立即。在这种情况下,将选择仍然阻止 10秒钟?
答案 0 :(得分:3)
如果select()
超时,但您要去读取未准备好的阻止文件描述符,那么您将阻止。对select()
的调用根本不会影响文件描述符的行为。
如果数据立即就绪,select()
调用将立即返回。如果数据在1秒后就绪,则select()
呼叫将在1秒后返回。如果在此期间没有准备好数据(或者如果数据在超时发生之前刚刚到达),它将在10秒后返回。