Проблема обработки файлового ввода-вывода с libevent2 - PullRequest
4 голосов
/ 28 марта 2011

Я работал с 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");

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 29 марта 2011

Мне нужно 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);

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

2 голосов
/ 28 марта 2011
1 голос
/ 28 марта 2011

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

для интеграции операций aio с libevent, см. libevent aio patch и сообщение , связанное с * stack5flow *, в котором упоминается использование signalfd (2) для маршрутизации событий сигнала aio в файлдескриптор, который можно использовать с различными реализациями опроса событий fd (так неявно с циклом libevent).

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

...