epoll_ctl: операция не допускается ошибка - c программа - PullRequest
3 голосов
/ 09 апреля 2011
  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 ]

7 голосов
/ 09 апреля 2011

С epoll_ctl(2):

   EPERM  The target file fd does not support epoll.

Я собираюсь догадаться, что doc - это обычный файл. Обычные файлы всегда готовы к read(2) или write(2) операциям, поэтому не имеет смысла epoll(7) или select(2) для обычных файлов.

Если doc - это сокет домена в формате pipe или unix, прокомментируйте здесь (чтобы я мог удалить свой пост) и исправьте свой вопрос, чтобы другие не повторили ту же ошибку, что и я. :)

1 голос
/ 10 мая 2013

В этом случае вы открываете обычный файл. epoll(), select() и poll() не имеют смысла для обычных файлов.

Если это труба или розетка, то:

$mkfifo doc
...