inotify和epoll的区别

30
我想知道inotify和epoll两种I/O观察器的区别是什么? inotify
  • inotify_init(void) 创建一个inotify实例以读取事件
  • inotify_add_watch(int fd, const char * path, int mask) 返回围绕路径的文件节点的监视fd
  • inotify_rm_watch(int fd, int wd) 停止在fd上观察事件
epoll
  • epoll_create(void) 创建epoll对象
  • epoll_ctl(int epfd, int op, int fd, struct epoll_event * event) 设置要观察的事件
  • epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 阻塞,直到事件发生
因此,文件观察似乎有不同的方法。Inotify试图让用户决定何时收集事件,而epoll则阻塞直到有事件发生。
这个理解正确吗?其他有什么不同之处?
1个回答

38
最大的区别是 epoll 可以用于任何 fd,这意味着它适用于观察所有类型的数据通信方式。套接字、IPC、文件、打印机等等。而 inotify 仅限于文件系统。
然而,由于 inotify 特定于文件系统,因此您可以接收关于广泛的文件系统特定属性的通知,例如文件属性和正在读取的文件。这些事情通过 epoll 是不可能实现的。
实际上,inotify 返回一个文件描述符——这意味着您可以使用 epoll 确定应调用 read 的哪些 inotify FD。因此,在某种程度上,两者是相辅相成的。 http://en.wikipedia.org/wiki/Inotify

谢谢,这回答了我的问题。除了 epoll 只能在 Linux 上使用,poll 在任何地方都可以使用(我想)。 - bodokaiser
1
我认为使用epoll(或poll或select)来查找由inotify创建的任何FD的读取时间非常酷,如果您设置了多个FD,则可以使用它。我可以看到有人这样做来监视某个基本目录,然后根据该基本目录中发生的更改设置条件观察。 - xaxxon
1
参考资料,自FreeBSD 11版本起,已经在其Linux兼容层中添加了对epoll的支持。(参考链接 - ghoti
4
"Epoll对于文件描述符并不能像你说的那样完全适用,尽管它有潜力可以这样做。请参考“Epoll on regular files”以了解详情。" - Sergey Mashkov

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