Предполагая, что вы хотите продолжить select()
с помощью read()
/ write()
/ send()
/ и т. Д., Когда оно вернет условия готовности, вы, безусловно, должны быть очень осторожны, если ваши файловые дескрипторы находятся в режиме блокировки.Для чтения необходимо убедиться, что вы читаете только один раз после того, как получите индикацию готовности к чтению, поскольку второе может блокироваться.Для записей это, вероятно, еще хуже: я предполагаю, что могут быть непонятные условия, при которых сокет сообщается о готовности к select()
, но что-то происходит, и он больше не готов к тому времени, когда вы write()
к нему.Даже если это последнее предположение слишком пессимистично, я бы посчитал это решение неприемлемым и плохой практикой.
Учитывая, что нетрудно динамически переключить файловый дескриптор с блокировки на неблокирование и обратно, используя fcntl()
, выВас так беспокоит совместимость с блокирующими сокетами?Просто измените их на неблокирующие.