Как использовать POSIX select () - PullRequest
3 голосов
/ 05 апреля 2011

Должен ли я сделать файловые дескрипторы неблокирующими перед их использованием в select()?

Ответы [ 3 ]

6 голосов
/ 05 апреля 2011

Не имеет значения.

select сообщает вам, какие сокеты доступны для чтения / записи / закрытия / имеют состояние, в котором вы заинтересованы. Блокировка / неблокировка влияет, например, на то, как. recv или send вызов акты. Они не зависят друг от друга.

3 голосов
/ 05 апреля 2011

Сам выбор будет блокировать независимо от состояния блокировки дескрипторов, которые он использует для мониторинга. Если вы не хотите, чтобы выбор блокировался, используйте тайм-аут 0 (т. Е. Укажите нулевую временную структуру, а не нулевой указатель).

0 голосов
/ 03 ноября 2013

Цель select - заблокировать, поэтому он будет игнорировать флаг неблокирования. Однако, как описано в разделе ошибок на страницах справочной системы Linux :

В Linux select () может сообщить дескриптор файла сокета как «готовый к чтению», но, тем не менее, при последующем чтении блокируется. Это может, например, произойти, когда данные поступили, но при проверке они имеют неверную контрольную сумму и отбрасываются. Там могут быть другие обстоятельства, при которых файловый дескриптор ложно сообщается как готовы. Таким образом, может быть безопаснее использовать O_NONBLOCK на сокетах, которые должны не блокировать.

Таким образом, из-за некорректного поведения, вы должны установить дескрипторы файлов на неблокирующие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...