Информация об изменениях

Сообщение epoll от 06.12.2022 14:34

Изменено 06.12.2022 14:41 maks1180

epoll
Задача стандартная — сетевое приложение, которое отвечает на входящие запросы.
Нужно получать уведомления:
1) EPOLLIN (на чтение) — если есть что прочитать из сокета (т.е. следим за состоянием).
2) EPOLLOUT (на запись) — только при смене состояния (т.е. следим за изменением состояния) на возможность записи, т.е. если раньше нельзя было писать а теперь можно.

В Windows через оконные сообщения, как раз так и работает, как я описал. Но в Линуксе, кажется нет хорошего решения.

Вариант №1 вызываем epoll_ctl( EPOLLET + EPOLLIN+EPOLLOUT)
не буду получать нотификацию EPOLLIN до следующих принятых данных, если прочитаю не всё что есть в сокете.
Как понять, что я всё прочитал из сокета ?

Вариант №2 вызываем epoll_ctl( EPOLLIN+EPOLLOUT) — без EPOLLET
буду постоянно получать EPOLLOUT, придёться постоянно вызывать epoll_ctl, что-бы снять или поставить EPOLLOUT. Это же функция ядра и вызов будет занимать время значительное ?
Вроде libuv так делает.

Какие ёще есть решения ?
Может быть сделать 2 epoll, один для чтения, другой для записи ? Тогда их из разных потоков нужно вызывать ?
epoll
Задача стандартная — сетевое приложение, которое отвечает на входящие запросы.
Нужно получать уведомления:
1) EPOLLIN (на чтение) — если есть что прочитать из сокета (т.е. следим за состоянием).
2) EPOLLOUT (на запись) — только при смене состояния (т.е. следим за изменением состояния) на возможность записи, т.е. если раньше нельзя было писать а теперь можно.

В Windows через оконные сообщения, как раз так и работает, как я описал. Но в Линуксе, кажется нет хорошего решения.

Вариант №1 вызываем epoll_ctl( EPOLLET + EPOLLIN+EPOLLOUT)
не буду получать нотификацию EPOLLIN до следующих принятых данных, если прочитаю не всё что есть в сокете.
Как понять, что я всё прочитал из сокета ?

Вариант №2 вызываем epoll_ctl( EPOLLIN+EPOLLOUT) — без EPOLLET
буду постоянно получать EPOLLOUT, придёться постоянно вызывать epoll_ctl, что-бы снять или поставить EPOLLOUT. Это же функция ядра и вызов будет занимать время значительное ?
Вроде libuv так делает.

Какие ещё есть решения ?
Может быть сделать 2 epoll, один для чтения, другой для записи ? Тогда их из разных потоков нужно вызывать ?