Да, это реально. Вот как это может произойти:
Будущая модификация протокола TCP добавляет возможность для одной стороны «отзывать» информацию, которую она отправила, при условии, что она еще не была получена прикладным уровнем другой стороны. Эта функция согласовывается при подключении. Другая сторона отправляет вам некоторые данные, вы получаете удар select
. Прежде чем вы сможете вызвать recv
, другая сторона «аннулирует» данные, используя это новое расширение. Ваш read
получает сообщение об ошибке "блокирует", потому что нет доступных данных для чтения.
Функция select
- это функция сообщения о состоянии, которая не сопровождается будущими гарантиями. Предполагая, что нажатие на select
теперь гарантирует, что последующая операция не будет блокирована, столь же недействительно, как и использование любой другой функции сообщения о состоянии таким образом. Это так же плохо, как использовать access
, чтобы попытаться гарантировать, что последующая операция не завершится с ошибкой из-за неправильных разрешений, или использовать statfs
, чтобы попытаться гарантировать, что последующая запись не завершится с ошибкой из-за заполнения диска.