2012-05-16 18 views
7

Während des Debuggen unserer Anwendung in Linux-Umgebung können wir beobachten, dass einige Ereignisse - POLLHUP|POLLIN nur unter Linux auftreten. Unsere Anwendung verwendet Unix-Sockets. Wenn wir das tun:Umfrage Implementierung auf Linux vs Umfrage Implementierung auf Solaris

ret = poll(xpoll->pfd, xpoll->pfd_count, xpoll_timeout); 

strace zeigt:

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}]) 

Diese Situation tritt nie in solaris (gleiche Anwendung): Struss zeigt:

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 

Können Sie mir bitte erklären, was ist Der Unterschied zwischen Umfrage in Solaris und Umfrage in Liunx? Thx im Voraus für alle Antworten.

+0

Linux gibt POLLIN (zu lesende Daten) auch im Falle von EOF zurück. Linux gibt es keine POLLEOF Flagge. Das ist alles, worüber ich jetzt schreibe. – B4NZ41

Antwort

3

Sowohl Linux als auch Solaris konnten POLLLIN für bestimmte Dateitypen, insbesondere Pipes, nicht für EOF festlegen. Eine häufige Problemumgehung bestand darin, gemeinsam nach POLLHUP und POLLIN zu suchen. So weit ich weiß, behielten die Linux-Kernentwickler es so (wahrscheinlich beabsichtigt), während die Solaris-Gefährten dieses Verhalten änderten, um POLLIN POLLEOF zu verwenden.

Dies sollte jedoch kein Problem für Ihre Anwendung sein: Um die Portabilität einer Anwendung zu erhöhen, würde man immer nach beiden Flags in der Bitmaske suchen.

Prost!

+0

BTW, da POLLEOF nicht Teil von POSIX ist - vielleicht ist es ein Alias ​​für ein anderes Makro (-Combination) wie POLLIN oder POLLIN | POLLHUP? Ich muss das überprüfen ... – mjhennig