Поведение epoll при записи в файловый дескриптор - PullRequest
2 голосов
/ 24 марта 2012

Я использую epoll для записи больших сообщений на сервер по протоколу HTTP. Все fds настроены на неблокирование, и я использую инициируемые фронтом события. Я знаю, для EPOLLIN мне нужно перебрать чтение fd, пока не вернется EAGAIN Для написания я не уверен, должен ли я продолжать цикл, как только я получу EAGAIN, или я должен ждать, пока epoll сообщит, когда fd станет доступным для чтения снова.

Например, я пишу сообщение размером 20 КБ, а при первой попытке :: записи количество отправленных данных = 13 КБ. Следующая попытка записи возвращает retVal = -1 и errno = EAGAIN.

В этот момент я должен продолжить цикл некоторое время (1), пока не смогу записать данные, или я должен ждать, пока epoll вызовет мой обратный вызов, когда FD будет снова готов к записи. Насколько я понимаю, поскольку fd зарегистрирован для записи, epoll должен уведомить меня, когда FD снова будет готов к записи. Но в моей программе этого не происходит.

Нужно ли устанавливать специальный флаг или модифицировать FD для получения уведомления?

1 Ответ

5 голосов
/ 24 марта 2012

В этот момент я должен продолжить цикл (1), пока не смогу записать данные

Нет!

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

Да, вы должны (но какой обратный вызов? epoll_wait не имеет механизма обратного вызова, он просто возвращает)

Насколько я понимаю, поскольку fd зарегистрирован для записи, epoll должен уведомить меня, когда FD снова будет готов к записи. Но, похоже, этого не происходит в моей программе.

Если FD зарегистрирован с EPOLLOUT или EPOLLIN | EPOLLOUT, это действительно так. Не могли бы вы привести небольшой пример, демонстрирующий проблему?

...