Epoll在普通文件上的应用

32

epoll(在Linux上)能否在常规文件中发挥作用?我知道它主要用于套接字,但我只是想知道。

<结果> <代码>epoll(在Linux上)是否可以对常规文件有所帮助?虽然它主要用于套接字,但仍然可能有用。
2个回答

29

不完全是这样。 epoll 只对那些在读/写时通常表现出阻塞行为的文件描述符有意义,比如管道和套接字。普通文件描述符通常会立即返回结果或文件结束,因此对它们使用 epoll 没有任何用处。


3
换言之,它是有功能的,但毫无意义:“poll()函数应支持常规文件... 常规文件始终应返回可读和可写的TRUE。” http://pubs.opengroup.org/onlinepubs/009695399/functions/poll.html epoll(4)手册中说:“当作为Level Triggered接口使用时,epoll在所有情况下都比poll(2)更快,并且可以用于后者使用的任何地方,因为它共享相同的语义。” 因此,正如duskwuff所说,它不会执行任何有用的操作。 - mkj
17
这很愚蠢也是错误的。内核可能因为很多原因而挂起,比如磁盘从休眠状态唤醒或者网络共享/驱动器的网络延迟。任何形式的设备交互都可能导致 IO 挂起。select/epoll/poll/kqueue 应该可以与任何文件描述符一起使用,同时任何文件描述符都应该允许非阻塞。 - Rahly
2
@Rahly 这是不可能的。内核事先不知道文件写入是否会阻塞——与套接字或管道不同,文件系统写入缓冲区不专门为单个FD服务,因此无法保证它们将可用于特定进程。 - user149341
4
@duskwuff,当然可以这样做,但由于特定的限制而选择不这样做。例如,内核知道缓冲区包含什么内容。总之,epoll并不能保证一切,只是更有可能。从理论上讲,预读(readahead)可以“请求”系统提供特定数据,并将EPOLLIN / EPOLLERR信号放入epoll队列中。此外,仅因为它没有这样做,并不意味着它仍然不傻或错误。实现方式与功能无关。 - Rahly
2
这个仓库中说到:"Linux对使用epoll作为异步I/O机制的支持有限[...]如果文件以O_NONBLOCK方式打开,则读取将返回EAGAIN,直到相关部分在内存中",这与这个答案相矛盾。但是在一个简单的测试中,我无法证实这一点。谁是正确的? - nh2
显示剩余2条评论

23

我认为它将在 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接