2014-06-12 7 views
0

При использовании Libevent для обнаружения чтения/записи готовности неблокирующего файловых дескрипторов диска (для файлов gaurded обязательной блокировки), я столкнулся следующий вопросом:Как использовать libevent для обнаружения блокировки файла?

Когда файл заблокирован для IO другого процесса, я получаю EAGAIN в текущем процессе, когда я выдаю вызов чтения/записи, который идеально согласуется с документированным поведением API.

Однако, когда эти FDs опрошены libevent для готовности к IO, они обнаруживаются как IO ready, что приводит к вызову моего обратного вызова.

Я пытался найти решение для этого, но я не знаю, ищу ли я правильные строки. Можно ли избежать этих вызовов?

ответ

0

According to POSIX:

Дескрипторы файлов, связанных с обычными файлами всегда должны выбрать верно для готов читать, готовый писать, и условия ошибки.

Не уверен, что есть лучший способ, чем развернуть поток, который блокируется в этом файловом дескрипторе, а затем отправляет событие обратно в поток ввода-вывода при разблокировке файла.

inotify предоставляет событие, когда файл открыт или закрыт, но не заблокирован или разблокирован, к сожалению.

+0

Я пытаюсь достичь асинхронного ввода-вывода в однопоточном приложении. И поскольку блокировки могут быть не только основанием (теоретически) для EAGAIN, этот подход не будет работать для меня – skaur

+1

@skaur Иногда у вас нет другого выбора, кроме как создать другой поток и позволить ему блокировать что-то, чтобы избежать опроса. –

+0

@maxim .. У меня нет выбора тогда, я думаю :) – skaur

 Смежные вопросы

  • Нет связанных вопросов^_^