2011-03-28 4 views
3

Я некоторое время работал с libevent2, но обычно использовал его для обработки сетевых операций ввода-вывода (с использованием сокетов). Теперь мне нужно прочитать много разных файлов, чтобы я тоже хотел его использовать. Я создал этот код:Проблема с файлом ввода-вывода с libevent2

int file = open(filename, O_RDONLY); 
struct event *ev_file_read = event_new(ev_base, file, EV_READ | EV_PERSIST, read_file, NULL); 

if(event_add(ev_file_read, NULL)) 
     error("adding file event"); 

К сожалению, это не сработало. Я получаю это сообщение при попытке добавить событие:

[предупреждение] Не удалось выполнить попытку сползания Epoll ADD (1) на fd 7. Старые события были 0; прочитанное изменение было 1 (добавить); изменение записи было 0 (нет): Операция не допускается добавления события файла: Операция не допускается

Файл существует и имеет право на чтение/записи.

Кто-нибудь знает, как обращаться с файлом IO с помощью libevent? Я также думал о буферизованных событиях, но в API есть только функция bufferevent_socket_new(), которая здесь не применяется.

Заранее спасибо.

ответ

5

Мне нужен был libevent, чтобы прочитать много файлов о приоритетах. Проблема была в epoll не в libevent. Epoll не поддерживает обычные файлы Unix.

Чтобы решить эту проблему, я вынужден Libevent не использовать Epoll:

struct event_config *cfg = event_config_new(); 

event_config_avoid_method(cfg, "epoll"); 

ev_base = event_base_new_with_config(cfg); 
    event_config_free(cfg); 

Следующий метод в списке предпочтений был опрос, который полностью поддерживает файлы так же, как я хотел.

Спасибо всем за ответы.

+0

О, боже, я потратил столько времени пытаясь понять это. благодаря – c00kiemon5ter

1

Если вы хотите сделать асинхронный диск i/o, вы можете проверить семейство aio_ * (см. Man (3) aio_read). это POSIX.1-2001 и доступно на linux и bsd (по крайней мере).

для интеграции операций AIO с Libevent см libevent aio patch и related stackoverflow post, которые упоминают с помощью signalfd (2), чтобы направить события AIO сигнала на дескриптор файла, который может быть использован с различной Fd реализации избирательных событий (так неявно с Libevent цикла) ,

EDIT: libevent также имеет поддержку обработки сигналов (полностью забыл об этом), чтобы вы могли попробовать и зарегистрировать/обработать сигналы aio directlry с/из цикла libevent. Я бы лично пошел и попробовал патч libevent, если это позволяют ваши правила разработки.

2

Не имеет смысла регистрировать стандартные файловые дескрипторы с libevent. File descriptors associated with regular files shall always select true for ready to read, ready to write, and error conditions.

+3

О, это имеет большой смысл хотеть такое, поверьте мне. и вы можете получить его, добавив один уровень косвенности, см. ниже (или выше). – user237419

+0

Это имеет мало общего с обычным файловым дескриптором. –

+2

прямо ему нечего делать, я не посмею сказать обратное; но вы все равно сможете интегрировать дисковый ввод-вывод в существующий цикл событий, и это может устранить некоторую сложность, уменьшить время отклика и т. д. (например, случай статической, только для работы с HTTP-файлом) – user237419