Должен ли я использовать цикл отправки по краю? - PullRequest
6 голосов
/ 05 июля 2011

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

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

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

Если n> 0 && n

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

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

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

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

0 голосов
/ 07 июля 2011

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

...