7

在 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有什么区别吗?提前谢谢所有答案。

4

1 回答 1

3

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

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

干杯!

于 2012-05-31T22:45:21.737 回答