在Linux环境中调试应用程序期间,我们可以观察到一些事件-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中永远不会发生(相同的应用程序):
struss显示:
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中的poll和liunx中的poll有什么区别吗?
事先向所有答案致谢。

最佳答案

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

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

干杯!

09-06 02:46