7
  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 }

When compiling this code, there was no errors. gcc -o epoll epoo.c

but when i tried to execute the program 'epoll', i got the error message

epoll_ctl:Operation not permitted.

I've tried to change the 'doc' file's mode to 0777 but it was not work.

What is the problem? Thank you :)

Falko
  • 17,076
  • 13
  • 60
  • 105
webnoon
  • 945
  • 3
  • 9
  • 18

2 Answers2

13

From epoll_ctl(2):

   EPERM  The target file fd does not support epoll.

I'm going to guess that doc is a regular file. Regular files are always ready for read(2) or write(2) operations, thus it doesn't make sense to epoll(7) or select(2) on regular files.

If doc is a pipe or unix domain socket, comment here (so I know to delete my post) and amend your question so others don't make the same mistake I did. :)

sarnold
  • 102,305
  • 22
  • 181
  • 238
  • You were right! Doc is regular file. i'm a newby at programming so your answer was so helpful to me. thank you :) – webnoon Apr 09 '11 at 08:30
1

In this case you're opening a regular file. epoll(), select(), and poll() don't make sense on regular files.

If it is a pipe or socket, then:

$mkfifo doc
Michael Myers
  • 188,989
  • 46
  • 291
  • 292