2011-11-08 10 views

Trả lời

11

Không thực sự. epoll chỉ có ý nghĩa đối với các bộ mô tả tệp thông thường thể hiện hành vi chặn trên đọc/ghi, như đường ống và ổ cắm. Các bộ mô tả tập tin bình thường sẽ luôn trả lại kết quả hoặc kết thúc tập tin nhiều hơn hoặc ít hơn ngay lập tức, vì vậy epoll sẽ không làm bất cứ điều gì hữu ích cho chúng.

+2

Nghĩa là, nó hoạt động, mặc dù vô nghĩa: "Cuộc thăm dò() chức năng có trách nhiệm hỗ trợ các file thường xuyên ... các file thường xuyên phải luôn thăm dò ý kiến ​​TRUE cho đọc và viết." http://pubs.opengroup.org/onlinepubs/009695399/functions/poll.html Trang người đàn ông epoll (4) cho biết: "khi được sử dụng làm giao diện Cấp Triggered, epoll có nghĩa là cuộc thăm dò nhanh hơn (2) và có thể được sử dụng bất cứ nơi nào sau này được sử dụng vì nó chia sẻ cùng một ngữ nghĩa. " Vì vậy, như duskwuff nói, nó sẽ không làm bất cứ điều gì hữu ích. – mkj

+1

Điều đó thật ngớ ngẩn và sai. Các hạt nhân có thể treo lên vì rất nhiều lý do, từ đĩa quay lên (nếu ngủ), xuống đến mạng tụt hậu từ một mạng chia sẻ/ổ đĩa. Bất kỳ loại tương tác thiết bị nào cũng có thể gây ra lỗi IO. chọn/epoll/poll/kqueue nên được thực hiện để làm việc với bất kỳ bộ mô tả tập tin nào cũng như bất kỳ mô tả tệp nào sẽ cho phép không chặn. – Rahly

+0

@Rahly Điều đó là không thể. Hạt nhân không biết trước khi ghi vào một tệp sẽ chặn - không giống như ổ cắm hoặc đường ống, bộ đệm để ghi hệ thống tệp không dành riêng cho một FD, vì vậy không có cách nào đảm bảo chúng sẽ có sẵn cho một quy trình cụ thể . – duskwuff

11

Tôi nghĩ rằng, nó sẽ thất bại tại epoll_ctl với EPERM:

EPERM The target file fd does not support epoll. 

nếu tập tin không có giao diện poll().

Mã thực tế là http://lxr.linux.no/#linux+v3.1/fs/eventpoll.c#L1373

1373 /* The target file descriptor must support poll */ 
1374  error = -EPERM; 
1375  if (!tfile->f_op || !tfile->f_op->poll) 
1376    goto error_tgt_fput; 
1377