#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