При использовании epoll, запускаемого по краю, я должен перебрать send?

Я использую epoll для написания медиа-сервера. Все fds настроены на неблокирование, и я использую инициируемые фронтом события. Я знаю, что для EPOLLIN мне нужно перебрать чтение fd, пока не вернется EAGAIN. Но как насчет письма?

Когда я хочу написать, я ставлю данные в очередь и устанавливаю EPOLLOUT|EPOLLIN|EPOLLET на fd. Когда происходит событие EPOLLOUT, я записываю весь буфер в очереди одним выстрелом:

n = send ( fd, buf, buf_len, MSG_NOSIGNAL );

Если n > 0 && n

Является ли устранение системного вызова здесь наиболее эффективным маршрутом?

2 ответа

Решение

Страница руководства epoll гласит:

Для потоково-ориентированных файлов (например, pipe, FIFO, потоковый сокет) условие, что пространство ввода-вывода для чтения / записи исчерпано, также может быть обнаружено путем проверки объема данных, считываемых / записываемых в дескриптор целевого файла. Например, если вы вызываете read(2), запрашивая чтение определенного объема данных, и read(2) возвращает меньшее количество байтов, вы можете быть уверены, что исчерпали пространство чтения ввода-вывода для файлового дескриптора. То же самое верно при написании с использованием write (2). (Избегайте этого последнего метода, если вы не можете гарантировать, что отслеживаемый дескриптор файла всегда ссылается на файл, ориентированный на поток.)

Я сделал кучу тестов, и кажется, что цикл по отправке - пустая трата времени.

Другие вопросы по тегам