2012-05-16 32 views
7

Trong khi gỡ lỗi ứng dụng của chúng ta trong môi trường Linux, chúng ta có thể quan sát thấy một số sự kiện - POLLHUP|POLLIN chỉ xảy ra trên linux. Ứng dụng của chúng tôi sử dụng ổ cắm unix. Khi chúng ta làm:thực hiện thăm dò ý kiến ​​trên linux vs poll thực hiện trên solaris

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

strace cho thấy:

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

tình hình đó không bao giờ xảy ra trong solaris (cùng ứng dụng): struss cho thấy:

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 

Bạn có thể vui lòng giải thích cho tôi là những gì sự khác biệt giữa các cuộc thăm dò trong solaris và thăm dò ý kiến ​​trong liunx? Thx trước cho tất cả các câu trả lời.

+0

Linux trả về POLLIN (dữ liệu để đọc) ngay cả trong trường hợp EOF. Linux không có cờ POLLEOF. Đó là tất cả những gì tôi có bây giờ. – B4NZ41

Trả lời

3

Cả hai, Linux và Solaris, được sử dụng để không đặt POLLIN cho EOF trên một số loại tệp, đặc biệt là đường ống. Một cách giải quyết phổ biến là kiểm tra POLLHUP và POLLIN cùng nhau. Theo như tôi biết, các nhà phát triển cốt lõi Linux giữ nó theo cách đó (có thể dự định), trong khi các nghiên cứu sinh Solaris thay đổi hành vi đó để sử dụng POLLIN POLLEOF.

Tuy nhiên, điều này sẽ không có vấn đề cho ứng dụng của bạn: Để tăng tính di động của ứng dụng, người ta sẽ luôn kiểm tra cả hai cờ trong mặt nạ bit.

Chúc mừng!

+0

BTW, vì POLLEOF không phải là một phần của POSIX - có thể đó là bí danh cho một macro (tổ hợp khác) như POLLIN hoặc POLLIN | POLLHUP? Tôi phải kiểm tra ... – mjhennig

Các vấn đề liên quan