IP C для "пробуждения" из epoll () (C, UNIX) - PullRequest
0 голосов
/ 26 марта 2020

Мне нужно "разбудить" процесс, который ожидает epoll () от другого процесса .

Я создал UDS (AF_ UNIX) тип SOCK_DGRAM, где :

  • Клиент каждые несколько мс может отправить один символ на сервер
  • Сервер ожидает с сокетом epoll () для чтения
    • Мне не нужны данные от клиента, только чтобы «проснуться» от него

Как я могу сделать это наиболее эффективно ? Должен ли я читать () данные? Может ли сервер каким-то образом игнорировать данные, не перегружая память сокета?

1 Ответ

2 голосов
/ 26 марта 2020

Должен ли я читать () данные? Может ли сервер каким-то образом игнорировать данные, не перегружая память сокета?

Если вы получаете данные на сокете на постоянной основе, тогда да, вам нужно прочитать эти данные, иначе буфер сокета будет в конечном итоге заполнить. После этого вы больше не будете получать данные. Вам не нужно ничего делать с данными, которые вы читаете, и вы можете использовать много байтов за раз, если вы используете sh, но чтение данных - это то, как вы удаляете их из буфера сокетов.

Вы также обнаружите, что epoll_wait() ведет себя не так, как вы хотите, если вы не читаете данные. Если вы смотрите сокет fd в режиме триггера уровня, и уже есть данные, доступные для чтения, epoll_wait() не будет блокироваться. Если вы наблюдаете за сокетом fd в режиме запуска по фронту, и уже есть данные, готовые для чтения, то получение дополнительных данных не приведет к блокировке epoll_wait() до un .

Как я могу сделать это наиболее эффективно ?

Вы действительно беспокоитесь об однобайтовых read() вызовах со скоростью, не превышающей один раз в несколько миллисекунд? Это для какой-то встроенной системы с низким энергопотреблением?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...