epoll_ctl:不允许操作错误 - c程序

时间:2011-04-09 07:48:16

标签: c linux file io epoll

  1 #include <sys/epoll.h>
  2 #include <stdio.h>
  3 #include <sys/types.h>
  4 #include <sys/stat.h>
  5 #include <fcntl.h>
  6 #include <string.h>
  7 #include <sys/uio.h>
  8 
  9 int main() {
 10   struct epoll_event event ;
 11   int ret,fd, epfd ;
 12 
 13   fd = open("doc", O_RDONLY);
 14   if( fd < 0 )
 15     perror("open");
 16 
 17   event.data.fd = fd ;
 18   event.events = EPOLLIN|EPOLLOUT ;
 19 
 20   epfd = epoll_create(50);
 21   printf("%d", epfd );
 22 
 23   if( epfd < 0 )
 24     perror("epoll_create");
 25 
 26   ret = epoll_ctl( epfd, EPOLL_CTL_ADD, fd, &event ) ;
 27   if( ret < 0 )
 28     perror("epoll_ctl");
 29 
 30 }

编译此代码时,没有错误。     gcc -o epoll epoo.c

但是当我尝试执行程序'epoll'时,我收到了错误消息

  

epoll_ctl:不允许操作。

我试图将'doc'文件的模式更改为0777,但它无效。

有什么问题?谢谢:))

2 个答案:

答案 0 :(得分:7)

来自epoll_ctl(2)

   EPERM  The target file fd does not support epoll.

我猜测doc是一个普通文件。常规文件始终read(2)write(2)操作做好准备,因此对常规文件epoll(7)select(2)没有意义。< / p>

如果doc是管道或unix域套接字,请在此处发表评论(因此我知道要删除我的帖子)并修改您的问题,以便其他人不会犯同样的错误。 :)

答案 1 :(得分:1)

在这种情况下,您将打开常规文件。 epoll()select()poll()对常规文件没有意义。

如果是管道或插座,则:

$mkfifo doc