poll()的文档没有详细解释这一点。在轮询 fd 时,什么时候应该使用 POLLIN,什么时候应该使用 POLLPRI?任何见解都会有用。
poll()
文档上有一些描述。
POLLIN There is data to read.
POLLPRI There is urgent data to read.
POLLIN
,如果有数据或紧急数据读取,poll()
将会返回。POLLPRI
,poll()
只有在有紧急数据需要读取时才会返回,而忽略正常数据。什么是紧急数据?
比如tcp的带外数据。在 TCP 帧头中,有一个名为
urg_data
的标志。 urg_data
表示该帧具有更高的优先级传送。
一旦内核收到 urg_data
标记的帧,它就会设置一个 POLLPRI
标志!看下面的代码:
...
if (tp->urg_data & TCP_URG_VALID)
mask |= POLLPRI;
....
return mask;
根据 UNIX 网络编程,第 3 版,
POLLPRI
是 STREAMS 独有的,在 POSIX 兼容系统上使用 TCP 或 UDP 时永远不会被触发。
我总是使用它们,这是可能的,因为它们是位掩码(所以你可以使用
POLLIN | POLLPRI
)。
优先条目用于被认为比常规信息更重要的信息。理想情况下,您会要求两种类型,然后首先检查/处理优先类型。