2

poll() 的文档没有详细解释这一点。在 fd 上轮询时,什么时候应该使用 POLLIN,什么时候应该使用 POLLPRI?任何见解都会很有用。

4

3 回答 3

9

poll() 文档中有一些描述。

POLLIN 有数据要读取。POLLPRI 有紧急数据要读取。

如果仅使用 POLLIN,则 poll() 将在有数据或紧急数据要读取时返回。如果只使用 POLLPRI,poll() 将仅在有紧急数据要读取时返回,而忽略正常数据。

什么是紧急数据?比如tcp的带外数据。在 TCP 帧头中,有一个名为 urg_data 的标志。Urg_data 表示此帧具有更高的传递优先级。一旦内核接收到一个 urg_data 生成的帧,它就会设置一个 POLLPRI 标志!看下面的代码:

...
if (tp->urg_data & TCP_URG_VALID)
   mask |= POLLPRI;
....
return mask;
于 2013-03-15T02:00:59.913 回答
2

根据 UNIX Network Programming, 第 3 版,POLLPRISTREAMS 独有,在 POSIX 兼容系统上使用 TCP 或 UDP 时永远不会触发。

https://books.google.dk/books?id=ptSC4LpwGA0C&pg=PA183&lpg=PA183&dq=POLLRDNORM+POLLRDBAND+POLLPRI&source=bl&ots=Ks7CSockOv&sig=nqzhameGpvzi_TSq1-2qi9gqdaY&hl=en&sa=X&ved=0ahUKEwjjqaOh9cbPAhWGjCwKHWjxCdw4ChDoAQg_MAc#v=onepage&q=POLLRDNORM%20POLLRDBAND%20POLLPRI&f=错误的

于 2016-10-06T19:57:12.733 回答
1

我总是使用它们,这是可能的,因为它们是位掩码(所以你可以使用POLLIN | POLLPRI)。

优先级条目用于被认为比常规信息更重要的信息。理想情况下,您会要求两种类型,然后首先检查/处理优先级。

于 2013-03-15T01:07:12.407 回答