2011-11-08 50 views

回答

11

不是。 epoll僅適用於文件描述符,這些文件描述符通常會在讀/寫時顯示阻塞行爲,如管道和套接字。正常的文件描述符將總是或多或少地立即返回結果或文件結束,因此epoll不會對它們做任何有用的操作。

+2

也就是說,它的功能,但毫無意義:「這項調查()函數應支持常規文件...常規文件應始終輪詢TRUE閱讀和寫作。」 http://pubs.opengroup.org/onlinepubs/009695399/functions/poll.html epoll(4)手冊頁說:「當用作Level Triggered接口時,epoll一定是一個更快的輪詢(2),並且可以在任何後者使用的地方使用,因爲它共享相同的語義。「因此,正如暮色說的那樣,它不會做任何有用的事情。 – mkj

+1

這是如此愚蠢和錯誤。內核掛起的原因可能很多,從磁盤啓動(如果睡着)到網絡掛載共享/驅動器的網絡滯後。任何類型的設備交互都可能導致IO掛起。選擇/ epoll/poll/kqueue應該與任何文件描述符一起工作,並且任何文件描述都應該允許非阻塞。 – Rahly

+0

@Rahly這是不可能的。內核事先並不知道寫入文件是否會阻塞 - 與套接字或管道不同,文件系統寫入的緩衝區並不專用於單個FD,因此無法保證它們可用於特定進程。 – duskwuff

11

我認爲,這將在epoll_ctl失敗,EPERM

EPERM The target file fd does not support epoll. 

如果文件沒有poll()接口。

實際的代碼是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