У меня есть несколько вопросов к EPOLL при использовании Edge Triggered и с EPOLLONESHOT.
Упрощенная последовательность операторов приведена ниже. Фактически несколько файлов контролируются Epoll Fd, а набор управляется через определенный поток c. Используемые имена переменных говорят сами за себя и, конечно, установлены. Эта часть опущена для краткости:
1. Create epollFd
epollFd = epoll_create1(EPOLL_CLOEXEC);
2. Create events to monitor
epollEventParam.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLET | EPOLLONESHOT;
3. Add the FD to monitor and the events
epoll_ctl(epollFd, EPOLL_CTL_ADD, socketFd, &epollEventParam);
4. While loop with epoll_wait
while (1) {
noFdsEvented = epoll_wait(epollFd, epollEventsReported, maxEvents, -1);
/***************** REARM Here or after processing the events? ******/
epoll_ctl(epollFd, EPOLL_CTL_MOD, (int)epollEventsReported[i].data.fd, &epollEventParam);
/** if EPOLLIN, read until read returns EAGIN ***/
//Relevant code to read...
//After EAGAIN is returned, REARM Here instead of doing so earlier (above)?
/** if EPOLLOUT, write until write returns EAGIN ***/
//Relevant code to write...
//After EAGAIN is returned, REARM Here instead of doing so earlier (above)?
/*** If other events... process accordingly ***/
}
ВОПРОСЫ:
Когда используется EPOLLONESHOT, когда EPOLL должен быть перезаписан ? После получения события или после его обработки?
Элементарно. При записи или чтении мы отслеживаем данные, записанные / прочитанные до тех пор, пока EAGAIN не будет возвращен или частично прочитан / записан? Да / Нет.
Первоначально EPOLLOUT не установлен. При записи, когда запись возвращает EAGAIN, мы добавляем EPOLLOUT к событию, которое необходимо отслеживать. Да / Нет?
Когда EPOLLOUT снова запускается для FD, мы продолжаем писать с момента, когда EAGAIN был получен в последний раз, и продолжаем, пока не получим EAGAIN снова. Затем мы перевооружаемся. Да / Нет?
Если мы прочитаем частично и не РЕАРМ, новые данные продолжат поступать, но событие не будет инициировано. Таким образом, если мы читаем частично, нам нужно отслеживать это, а не полагаться только на обработчик событий для выполнения чтения. Правильно?