Начнем с того, что в Linux / glibc select()
задокументировано время от времени ложное сообщение о том, что дескрипторы файлов доступны для чтения, но нам не нужно полагаться на это, чтобы объяснить поведение.
Появляется основная проблемабыть таковым, что вы неверно истолковали значение select()
установки дескриптора файла в одном из предоставленных наборов fd для чтения или записи.Это не обязательно означает, что данные могут быть успешно переданы через FD.Скорее это означает, что fd вошел или уже находился в состоянии, когда попытка сделать это не будет блокировать , что включает случай, когда такая попытка потерпит неудачу без блокировки.Документация Linux и особенно POSIX ясна по этому вопросу.
В этом случае описанное вами поведение - именно то, что я ожидал.Вы создали потоково-ориентированный сокет, но не подключили его к одноранговому узлу, поэтому я ожидаю, что попытки read()
и write()
на нем немедленно завершатся неудачей.select()
поэтому вправе возвращать свой файловый дескриптор в своих наборах чтения и записи.