Если в то время как я поместил дескриптор соединения в rdset, используемый в select
системный вызов клиент закрывает этот дескриптор, поэтому он уже закрыт, когда
вызывается выбор, будет ли он по-прежнему выбран и доступен для чтения / записи
вернуть 0?
Или он останется в наборе и никогда не будет выбран?
Возможно, нет. Наиболее вероятным результатом является сбой вызова select()
, возвращающий -1
и устанавливающий errno
в EBADF
. Для POSIX , это означает, что
В одном или нескольких наборах дескрипторов файлов указан дескриптор файла, который не является допустимым дескриптором открытого файла.
Страница руководства Linux для select (2) предоставляет дескриптор файла, который уже был закрыт, как конкретный пример плохого дескриптора файла. Однако , руководство по Linux также документирует ошибку, что Linux select()
игнорирует FD в предоставленных fdsets, которые больше, чем любые, которые процесс в настоящее время имеет открытыми. Таким образом, в Linux вы не можете рассчитывать на сбой select()
в вашем сценарии, но если select()
не сбой, он никогда не выберет дескриптор файла, о котором идет речь.