epoll常规文件

Car*_*s00 23 c c++ sockets linux epoll

可以epoll(在Linux上)对常规文件有用吗?我知道它主要用于插座,但只是奇怪.

dus*_*uff 18

并不是的.epoll只对通常会在读/写上表现出阻塞行为的文件描述符有意义,比如管道和套接字.普通文件描述符将始终或多或少地立即返回结果或文件结尾,因此epoll不会对它们执行任何有用的操作.

  • 哪个是如此愚蠢和错误.内核可能由于很多原因而挂起,从磁盘旋转(如果睡着了)到网络安装的共享/驱动器的网络延迟.任何类型的设备交互都可能导致IO挂起.select/epoll/poll/kqueue应该用于任何文件描述符,以及任何文件描述应该允许非阻塞. (5认同)
  • 也就是说,它的功能虽然毫无意义:"poll()函数应支持常规文件...常规文件应始终轮询为TRUE以进行读写." http://pubs.opengroup.org/onlinepubs/009695399/functions/poll.html epoll(4)手册页说:"当用作Level Triggered接口时,epoll绝对是一个更快的轮询(2),并且因为它具有相同的语义,所以可以在后者使用的任何地方使用." 因此,正如duskwuff所说,它不会做任何有用的事情. (2认同)
  • @Rahly 那是不可能的。内核事先并不知道对文件的写入是否会阻塞——与套接字或管道不同,文件系统写入的缓冲区不是专用于单个 FD,因此无法保证它们可用于特定进程。 (2认同)
  • @duskwuff可以,但是由于特定的限制而选择不这样做。例如,内核知道缓冲区包含的内容。总的来说,Epoll不能保证任何事情。可能性更大。从理论上讲,预读可以使系统“查询”特定数据,并将EPOLLIN / EPOLLERR信号放入epoll队列。而且,仅仅因为它不这样做,并不意味着它仍然不是愚蠢和/或错误的。实现的完成方式与其应如何运作无关。 (2认同)
  • 在[这个仓库](https://github.com/littledan/linux-aio/issues/2)中,_“Linux对使用epoll作为异步I/O机制的支持有限[...]如果文件以 O_NONBLOCK 打开,则读取将返回 EAGAIN,直到相关部分位于内存中”_,这与此答案相矛盾。但在一个简单的测试中我无法证实这一点。谁是对的? (2认同)

osg*_*sgx 16

我认为,它将在epoll_ctl上失败并使用 EPERM:

   EPERM  The target file fd does not support epoll.
Run Code Online (Sandbox Code Playgroud)

如果文件没有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
Run Code Online (Sandbox Code Playgroud)