2012-03-24 4 views
1

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

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

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

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

ответ

4

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

Нет!

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

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

Я понимаю, что, поскольку ФД зарегистрирован для записи, Epoll должен уведомить меня когда FD готов к записи снова. Но это, похоже, не происходит в моей программе.

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

+0

Джеймс, спасибо за ответ. У меня была ошибка в коде - вот почему я не получал события EPOLLET на fd, как только он был доступен для записи снова. Он работает так, как ожидалось. – user1290156

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