Вопрос о сроках перевооружения EPOLL и связанные с этим вопросы при использовании Epoll Edge Triggered - PullRequest
1 голос
/ 22 февраля 2020

У меня есть несколько вопросов к 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 ***/

}

ВОПРОСЫ:

  1. Когда используется EPOLLONESHOT, когда EPOLL должен быть перезаписан ? После получения события или после его обработки?

  2. Элементарно. При записи или чтении мы отслеживаем данные, записанные / прочитанные до тех пор, пока EAGAIN не будет возвращен или частично прочитан / записан? Да / Нет.

  3. Первоначально EPOLLOUT не установлен. При записи, когда запись возвращает EAGAIN, мы добавляем EPOLLOUT к событию, которое необходимо отслеживать. Да / Нет?

  4. Когда EPOLLOUT снова запускается для FD, мы продолжаем писать с момента, когда EAGAIN был получен в последний раз, и продолжаем, пока не получим EAGAIN снова. Затем мы перевооружаемся. Да / Нет?

  5. Если мы прочитаем частично и не РЕАРМ, новые данные продолжат поступать, но событие не будет инициировано. Таким образом, если мы читаем частично, нам нужно отслеживать это, а не полагаться только на обработчик событий для выполнения чтения. Правильно?

1 Ответ

1 голос
/ 24 марта 2020

Я не могу ответить на все из них, но я могу попытаться ответить на несколько.

Elementary. При записи или чтении мы отслеживаем данные, записанные / прочитанные до тех пор, пока EAGAIN не будет возвращен или частично прочитан / записан? Да / Нет.
  • Для чтения / записи: вы должны обрабатывать все следующие сценарии
    1. Если вы читаете / получаете EAGAIN или EWOULDBLOCK. Это указывает на то, что для чтения / записи ничего не осталось, и вы должны прервать получение l oop.
    2. Вы получите 0 байтов. Это означает, что другая сторона больше не подключена
    3. Вы получаете 0> байт. Вы успешно прочитали / записали данные и должны снова прочитать / записать.
  • Вам не обязательно отслеживать данные, а не просто убедиться, что вы обрабатываете вышеупомянутые 3 сценария ios.

Первоначально EPOLLOUT не установлен. При записи, когда запись возвращает EAGAIN, мы добавляем EPOLLOUT к событию, которое необходимо отслеживать. Да / Нет?

  • Да ... Я полагаю, что в случае, когда EPOLLOUT изначально установлен, на FD send () должно происходить то же поведение, которое вы описали в вопросе. ..после того, что вы просто напишите в FD независимо от уведомления о событии и остановитесь только после того, как получите ошибку EAGAIN / EWOULDBOCK.
...