libevent2 и файл io - PullRequest
       38

libevent2 и файл io

1 голос
/ 11 августа 2010

Я баловался с libevent2, и у меня работает чтение файлов, но оно блокируется. Есть ли способ сделать чтение файла не блокировать только в libevent. Или мне нужно использовать другую библиотеку ввода-вывода для файлов и заставить ее качать события, которые мне нужны.

fd = open("/tmp/hello_world",O_RDONLY);
evbuffer_read(buf,fd,4096);

Флаг O_NONBLOCK тоже не работает.

Ответы [ 3 ]

3 голосов
/ 11 августа 2010

В POSIX диски считаются «быстрыми устройствами», что означает, что они всегда блокируют (вот почему O_NONBLOCK не работал для вас).Только сетевые сокеты могут быть неблокирующими.

Существует POSIX AIO, но, например, в Linux, который имеет множество ограничений, делающих его непригодным для общего назначения (только для O_DIRECT, ввод / вывод должен быть выровнен по секторам).

Если вы хотите интегрировать обычный POSIX IO в асинхронный цикл событий, кажется, что люди прибегают к пулам потоков, где блокирующие системные вызовы выполняются в фоновом режиме одним из рабочих потоков.Одним из примеров такой библиотеки является libeio

2 голосов
/ 11 августа 2010

Нет.

Я еще не видел * nix, где вы можете сделать неблокирующий ввод / вывод для обычных файлов, не прибегая к более специальной библиотеке AIO (Хотя длянекоторые, например, Solaris, O_NONBLOCK имеет эффект, если, например, кто-то другой держит блокировку на файле)

0 голосов
/ 12 марта 2015

Пожалуйста, взгляните на libuv, который используется node.js / io.js: https://github.com/libuv/libuv

Это хорошая альтернатива libeio, потому что он хорошо работает во всех основных операционных системах, от Windows до BSD, Mac OS X и, конечно, Linux. Он поддерживает порты завершения ввода / вывода, что делает его лучшим выбором, чем libeio, если вы ориентируетесь на Windows.

Код на C также очень удобочитаемый, и я очень рекомендую этот урок: https://nikhilm.github.io/uvbook/

...