poll()系统调用中POLLIN和POLLPRI的区别



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

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

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

如果只使用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 Network Programming, 3rd edition, POLLPRI是STREAMS独占的,并且在POSIX兼容系统上使用TCP或UDP时永远不会触发。

https://books.google.dk/books?id=ptSC4LpwGA0C& pg = PA183&液化石油气= PA183& dq = POLLRDNORM + POLLRDBAND + POLLPRI&源= bl& ots = Ks7CSockOv&团体= nqzhameGpvzi_TSq1-2qi9gqdaY& hl = en& sa = X& ved = 0 ahukewjjqaoh9cbpahwgjcwkhwjxcdw4chdoaqg_mac # v = onepage& q = POLLRDNORM % 20 POLLRDBAND % 20 POLLPRI& f = false

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

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

相关内容

  • 没有找到相关文章

最新更新