关于linux上的poll实现与solaris上的poll实现

Jos*_*siP 7 c linux solaris

在linux环境中调试我们的应用程序时,我们可以观察到一些事件 - POLLHUP|POLLIN仅在linux上发生.我们的应用程序使用unix套接字.当我们这样做时:

ret = poll(xpoll->pfd, xpoll->pfd_count, xpoll_timeout);
Run Code Online (Sandbox Code Playgroud)

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}])
Run Code Online (Sandbox Code Playgroud)

那种情况永远不会发生在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
Run Code Online (Sandbox Code Playgroud)

你能解释一下我在solaris民意调查和liunx民意调查之间的区别吗?提前获取所有答案.

mjh*_*nig 3

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

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

干杯!