Libevent и файловый ввод / вывод - PullRequest
1 голос
/ 16 ноября 2011

Имеет ли libevent отношение к буферизованному файловому вводу / выводу?Я знаю, что он довольно хорошо обрабатывает сокеты, но касается ли он также обычных файлов, или это «только» оболочка epoll/...?

Ответы [ 3 ]

1 голос
/ 08 августа 2012

Использование libevent (или любого из базовых механизмов уведомления о готовности, таких как, например, epoll или kqueue) с обычными файловыми дескрипторами обычно не имеет смысла.Исключением являются файлы в NFS или использующие ядро ​​AIO с eventfd.

Файловые дескрипторы на локальных дисках всегда готовы, буферного пространства всегда достаточно, и операции всегда завершаются «немедленно».Операция записи просто копирует данные в буферный кеш, и фактическая запись на диск происходит ... всякий раз, когда это происходит .(обратите внимание, что эта ссылка специфична для Linux, но, возможно, кроме некоторых мелких деталей реализации, она работает так же в других системах)

0 голосов
/ 08 августа 2012

libevent находится на более низком уровне, чем буферизованный файловый ввод / вывод (что вы получаете с помощью stdio.h), напрямую используя файловые дескрипторы. Вы правы, считая, что это просто оболочка epoll / select / kevent / etc. Его целью является прослушивание событий в дескрипторах, что является самым низким уровнем файлового ввода-вывода. Однако вы можете использовать его в сочетании с библиотечными средствами ввода / вывода stdio.h, поскольку в конечном итоге также используются файловые дескрипторы. Вы можете использовать fileno(3) для извлечения дескриптора файла из FILE *, на котором вы хотите подождать.

0 голосов
/ 08 августа 2012

libevent не является упаковщиком epoll. Он выбирает метод максимальной производительности, доступный на каждой платформе.

Сокеты также являются файловыми дескрипторами, поэтому вы можете использовать libevent для файла io.

Вам нужно будет отключить использование epoll libevent. Если я правильно помню, Epoll не поддерживает файлы Unix.

struct event_config *cfg = event_config_new();
event_config_avoid_method(cfg, "epoll");
...