2012-05-16 5 views
7

Linux環境でのアプリケーションのデバッグ中に、POLLHUP|POLLINというイベントがLinuxでのみ発生することがわかります。私たちのアプリケーションはUNIXソケットを使用しています。私たちが行うと:sollでのlinuxとpollのインプリメンテーションの実装

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 

あなたは何がある私に説明していただけますsolunの投票とliunxの投票の違いは? すべての回答を事前にThxにしてください。

+0

EOFの場合でも、LinuxはPOLLIN(読み込むデータ)を返します。 Linux POLLEOFフラグはありません。 それは私が今すべてについてです。 – B4NZ41

答えて

3

LinuxとSolarisの両方で、いくつかの種類のファイル(特にパイプ)でPOLLINをEOFに設定できなかった。一般的な回避策は、POLLHUPとPOLLINを一緒にチェックすることでした。 私が知る限り、Linuxのコア開発者はそれをそのままにしていましたが、Solarisフェローはその動作を POLLIN POLLEOFに変更しました。

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

乾杯!

+0

BTW、POLLEOFはPOSIXの一部ではないので、POLLINやPOLLIN | POLLHUPのような別のマクロ(-combination)のエイリアスですか?私はそれを確認する必要があります... – mjhennig

関連する問題