epoll_ctl : ошибка при недопустимой операции — программа на языке Си

#c #linux #file #io #epoll

#c #linux #файл #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, amp;event ) ;
 27   if( ret < 0 )
 28     perror("epoll_ctl");
 29 
 30 }
  

При компиляции этого кода ошибок не было.
gcc -o epoll epoo.c

но когда я попытался выполнить программу ‘epoll’, я получил сообщение об ошибке

epoll_ctl: операция не разрешена.

Я пытался изменить режим файла ‘doc’ на 0777, но это не сработало.

В чем проблема? Спасибо 🙂

Ответ №1:

От epoll_ctl(2) :

    EPERM  The target file fd does not support epoll.
  

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

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

Комментарии:

1. Вы были правы! Doc — это обычный файл. я новичок в программировании, поэтому ваш ответ был для меня очень полезен. спасибо 🙂

Ответ №2:

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

Если это канал или сокет, то:

 $mkfifo doc