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

ソラリスでの投票とliunxでの投票の違いを教えてください。すべての回答について事前にThx。

4

1 に答える 1

3

LinuxとSolarisはどちらも、一部のタイプのファイル、特にパイプでEOFのPOLLINを設定できなかったものです。一般的な回避策は、POLLHUPとPOLLINを一緒にチェックすることでした。私の知る限り、Linuxコア開発者はそれをそのように維持しましたが(おそらく意図されていました)、Solarisフェローはその動作をPOLLINPOLLEOFを使用するように変更しました。

ただし、これはアプリケーションにとって問題にはならないはずです。アプリケーションの移植性を高めるために、ビットマスクの両方のフラグを常にチェックします。

乾杯!

于 2012-05-31T22:45:21.737 に答える