Linux上的轮询实现与solaris上的轮询实现

在linux环境下debugging我们的应用程序时,我们可以观察到一些事件 – POLLHUP|POLLIN只发生在linux上。 我们的应用程序使用unix套接字。 当我们这样做时:

 ret = poll(xpoll->pfd, xpoll->pfd_count, xpoll_timeout); 

strace显示:

 poll([{fd=4, events=POLLIN|POLLPRI|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLPRI|POLLERR|POLLHUP}, {fd=7, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 3, 16) = 1 ([{fd=7, revents=POLLIN|POLLHUP}]) 

这种情况在solaris(相同的应用)中从来不会发生:剧情节目:

 2463/3: fd=569 ev=POLLIN|POLLPRI|POLLERR|POLLHUP rev=0 2463/3: fd=639 ev=POLLIN|POLLPRI|POLLERR|POLLHUP rev=0 2463/3: fd=631 ev=POLLIN|POLLPRI|POLLERR|POLLHUP rev=POLLIN 2463/3: fd=1160 ev=POLLIN|POLLPRI|POLLERR|POLLHUP rev=0 2463/3: fd=400 ev=POLLIN|POLLPRI|POLLERR|POLLHUP rev=0 

你能解释一下在solaris和民意调查之间有什么不同吗? Thx提前为所有答案。

Linux和Solaris都无法在某些类型的文件(尤其是管道)上为EOF设置POLLIN。 一个常见的解决方法是一起检查POLLHUP和POLLIN。 据我所知,Linux核心开发人员保持这种方式(可能是有意的),而Solaris研究员改变了这种行为,使用POLLIN POLLEOF。

但是,这对你的应用程序来说应该不是问题:为了增加应用程序的可移植性,总会检查位掩码中的两个标志。

干杯!