При использовании 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). (Избегайте этого последнего метода, если вы не можете гарантировать, что отслеживаемый дескриптор файла всегда ссылается на файл, ориентированный на поток.)
Я сделал кучу тестов, и кажется, что цикл по отправке - пустая трата времени.