2010-08-11 3 views
1

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

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

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

ответ

3

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

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

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

2

No.

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

-1

Пожалуйста, обратите внимание на 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/