Сокет с `so_rcvtimeo` set at ettept returns` egain` раньше, чем ожидалось?Linux

Ответить
Anonymous
 Сокет с `so_rcvtimeo` set at ettept returns` egain` раньше, чем ожидалось?

Сообщение Anonymous »

Я работаю с сокетами и пытаюсь прочитать их с тайм -аутом, используя опцию so_rcvtimeo , но я получаю странное поведение, которое говорит мне, что я не понимаю, что происходит под капюшоном.
Мое (выявленное как неверное) понимание заключается в том, что, если я попытаюсь получить из сокета с этим набором опции, то он будет ждать продолжительности, указанной в соответствии с clock_monotonic (или, может быть, clock_boottime , но мне не волнует разница), чтобы получить пакет. Если эта полная продолжительность прошла и не было получено никакого пакета, то он вернется с ошибкой, указывающей, что за это время ничего не произошло. Раннее, например, путем получения и возврата пакета, получения сигнала или наличия некоторой ошибки. А в загруженной системе поток, который назвал этот метод, может потребоваться дополнительное время, пока ЦП станет доступным для запуска. Однако, учитывая, что ничто не делает метод выходить на раннем этапе и что ядра процессора не находятся под спорами, я ожидаю, что вызов recv в сокете с so_rcvtimeo set вернет eagain , и что количество времени, занятого в соответствии с clock_monotonic , будет продолжительностью, которую я установил, плюс небольшая дополнительная задержка, добавленная ядром, выполняющим бухгалтерский бухгалтер и планирование перед запуском. > Тем не менее, я запустил код C, который выглядит так в цикле: < /p>

Код: Выделить всё

setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
clock_gettime(CLOCK_MONOTONIC, &start_time);
recv(sock, buf, 512, 0);
clock_gettime(CLOCK_MONOTONIC, &end_time);
и я обнаружил, что небольшая доля времени (примерно один раз на 5 тыс. Заголовок), продолжительность между start_time и end_time меньше, чем продолжительность, чем я Установить, менее чем на 100 лет. Полный код проверяет, что recv Отчеты вызовов EAGAIN (поэтому ни один из ранних выходов не применимо), и в противном случае ни один из вызовов не возвращает ошибку.
Где Разнос растет моя модель происходящего от того, что на самом деле происходит? И сколько времени длится recv вызов, гарантированно ждал, если он сообщает EAGAIN ? Мне нужна жесткая нижняя часть во время ожидания этого случая для моего проекта.

Подробнее здесь: https://stackoverflow.com/questions/794 ... n-expected
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»