2012-01-03 26 views
12

Giả sử mã sau đây "sock" là một chốt xử lý cho TCP socket đã được đăng ký trước đó với một bộ mô tả tệp epoll được chỉ định bởi epfd.Có cần phải đăng ký lại một ổ cắm từ epoll trước khi đóng nó không?

epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev); 
close(sock); 

Vẫn cần thiết phải gọi epoll_ctl nếu ổ cắm sẽ được đóng sau đó? Hay ổ cắm có bị hủy đăng ký ngầm như là kết quả của việc đóng nó không?

Trả lời

22

Từ man page:

Q6 sẽ đóng một bộ mô tả tập tin gây ra nó phải được loại bỏ khỏi tất cả epoll đặt tự động?

A6 Có, nhưng hãy lưu ý điểm sau đây. Trình mô tả tệp là tham chiếu đối với mô tả tệp đang mở (xem open (2)). Bất cứ khi nào một bộ mô tả được nhân đôi qua dup (2), dup2 (2), fcntl (2) F_DUPFD, hoặc fork (2), một bộ mô tả tập tin mới đề cập đến mở cùng một mô tả tập tin được tạo ra. Mô tả tệp mở tiếp tục tồn tại cho đến khi tất cả các tệp mô tả đề cập đến nó đã bị đóng. Trình mô tả tệp được xóa chỉ từ epoll sau khi tất cả các mô tả tệp tham chiếu đến mô tả tệp mở cơ bản đã bị đóng (hoặc trước đó nếu mô tả được xóa rõ ràng bằng cách sử dụng epoll_ctl (2) EPOLL_CTL_DEL). có nghĩa là ngay cả sau khi bộ mô tả tập tin thuộc bộ epoll đã bị đóng, các sự kiện có thể được báo cáo cho bộ mô tả tập tin đó nếu tập tin mô tả khác tương tự như mở.

+0

Cảm ơn! Tôi tiếp tục làm "người đàn ông epoll_ctl", "người đàn ông epoll_create" tìm kiếm một câu trả lời, nhưng quên về trang người đàn ông tóm tắt cho "người đàn ông epoll". – selbie

+0

Vì vậy, miễn là không ai đã sao chép nó với dup() và quá trình này chưa được chia nhỏ, bạn ổn chứ? – MarkR

+0

Vâng, tôi nghĩ rằng tổng hợp nó độc đáo. –

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