2 последовательных системных вызова SELECT для одного и того же fd (сокета) одного требуют времени, в то время как второй возвращается немедленно, почему? - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть 2 ' Выбор ' вызовов один за другим на том же FD.оба имеют diff fd_set, но оба имеют только один fd int и один и тот же fd. (пытается прочитать из одного и того же сокета)

проблема во втором тайм-ауте выбора. Я пытаюсь воссоздать проблему, но не могу, в моем тестировании второй выбор проходит почти мгновенно, даже с таймаутом = 0.

Я запутался.Есть ли в сокете данные в пространстве ядра, из-за чего второй выбор проходит немедленно.

1 Ответ

1 голос
/ 08 ноября 2011

Да, сокет имеет входящие данные, буферизованные в пространстве ядра - это то, что вы получите, когда вызовете read(), после первого возврата select(), указывающего, что есть что-то доступное для чтения. Если вы еще не прочитали все это, тогда, конечно, немедленно вернется еще один select().

Если у вас есть с именем read(), то это, вероятно, означает, что доступно больше данных, чем вы прочитали, и вам следует продолжить чтение, пока вы не получите все это. Здесь возникает проблема только в том случае, если вызов read() завершается неудачно или блокируется после того, как select указал, что он доступен для чтения, или если у вас есть основания полагать, что после того, что вы уже прочитали, не должно быть никаких данных.

...