select()和fcntl()

时间:2017-11-07 06:12:08

标签: c unix select file-descriptor fcntl

我理解它的方式 - 我们可以使用fctnl将文件描述符标记为非阻塞,因此每当我们对该文件描述符调用任何阻塞操作时,它都会出错并修改errno为表示文件描述符尚未准备好。我们有责任经常轮询文件描述符,并在准备就绪时进行读或写。

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

现在我怀疑是:

  1. 假设我在需要的数组文件描述符上调用select 被读取并且超时而没有检测到任何事件。现在,如果我打电话 read在一个文件描述符上,它会阻塞还是会返回 E_WOULDBLOCK / E_AGAIN,即使我没有先使用fcntl吗?

  2. 我调用超时为10秒的select来检查单个文件 描述。并且可以在文件上读取数据 描述符几乎立即。在这种情况下,将选择仍然阻止 10秒钟?

1 个答案:

答案 0 :(得分:3)

  1. 如果select()超时,但您要去读取未准备好的阻止文件描述符,那么您将阻止。对select()的调用根本不会影响文件描述符的行为。

  2. 如果数据立即就绪,select()调用将立即返回。如果数据在1秒后就绪,则select()呼叫将在1秒后返回。如果在此期间没有准备好数据(或者如果数据在超时发生之前刚刚到达),它将在10秒后返回。