Я не уверен, насколько это может зависеть от реализации, так как в этой области select () есть некоторая нечеткость в зависимости от того, как вы читаете man-страницу, но системы, над которыми я работал, возвращали сокеткак читаемый, и тогда ваше чтение вернет ошибку (предполагается, что TCP, конечно, и удаленная сторона имеет RST-соединение). Ключевая часть - дескриптор считается готовым, если возможно выполнить соответствующую операцию ввода-вывода (например,читать (2) без блокировки. "который, если чтение немедленно вернулось с ошибкой, было бы верным утверждением.Я бы порекомендовал проверить это поведение на ваших целевых системах, написав простой клиентский сервер, подключив клиент, а затем выбрав для чтения.Пусть сервер примет, поспит на секунду, а затем выйдет сам.Если то, что я обычно видел, является стандартным для вас, выбор вернется с сокетом как читаемым, и ваше чтение не будет блокироваться, но вернет ошибку сброса соединения.
О, да, и просто, чтобы это имело значениехуже (из страниц руководства Linux )
В Linux select () может сообщать дескриптор файла сокета как «готовый к чтению», но, тем не менее, при последующем чтении блокируется.Это может, например, произойти, когда данные поступили, но при проверке они имеют неверную контрольную сумму и отбрасываются.Могут быть другие обстоятельства, при которых файловый дескриптор ложно сообщается как готовый.Поэтому может быть безопаснее использовать O_NONBLOCK на сокетах, которые не должны блокироваться.