2012-05-16 37 views
7

Podczas debugowania naszej aplikacji w środowisku linux możemy zauważyć, że niektóre zdarzenia - POLLHUP|POLLIN występują tylko w systemie Linux. Nasza aplikacja korzysta z gniazd unixowych. Kiedy robimy:implementacja sondowania na Linuksie kontra implementacja sondowania na solaris

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

strace pokazuje:

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

Taka sytuacja nie występuje w systemie Solaris (sam wniosek): Struss pokazuje:

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 

można proszę wyjaśnić mi, co jest różnica między ankietą w solaris a ankietą w Lunx? Thx z góry za wszystkie odpowiedzi.

+0

Linux zwraca POLLIN (dane do odczytu) nawet w przypadku EOF. Linux nie ma flagi POLLEOF. To wszystko, o czym teraz mówię. – B4NZ41

Odpowiedz

3

Zarówno w systemie Linux, jak i w systemie Solaris, nie ustawiono opcji POLLIN dla EOF na niektórych typach plików, zwłaszcza w rurach. Typowym obejściem było sprawdzenie razem z POLLHUP i POLLIN. O ile wiem, programiści jądra Linuksa zachowali to w ten sposób (prawdopodobnie w zamierzeniu), podczas gdy ludzie z Solaris zmienili to zachowanie, aby korzystać z POLLIN POLLEOF.

Nie powinno to jednak stanowić problemu dla twojej aplikacji: Aby zwiększyć przenośność aplikacji, należy zawsze sprawdzić obie flagi w masce bitowej.

Pozdrawiam!

+0

BTW, ponieważ POLLEOF nie jest częścią POSIX - może jest to alias dla innego makra (-połączenie) takiego jak POLLIN lub POLLIN | POLLHUP? Muszę to sprawdzić ... – mjhennig

Powiązane problemy