Будет ли выбран дескриптор, который был закрыт перед помещением в fd_set? - PullRequest
1 голос
/ 06 марта 2019

Если я поместил дескриптор соединения в набор параметров rdset, используемый в системном вызове select, клиент закроет этот дескриптор, поэтому он уже закрыт при вызове select, будет ли он по-прежнему выбран, и чтение и запись в него вернет 0?

Или он останется в наборе и никогда не будет выбран?

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Если в то время как я поместил дескриптор соединения в rdset, используемый в select системный вызов клиент закрывает этот дескриптор, поэтому он уже закрыт, когда вызывается выбор, будет ли он по-прежнему выбран и доступен для чтения / записи вернуть 0?

Или он останется в наборе и никогда не будет выбран?

Возможно, нет. Наиболее вероятным результатом является сбой вызова select(), возвращающий -1 и устанавливающий errno в EBADF. Для POSIX , это означает, что

В одном или нескольких наборах дескрипторов файлов указан дескриптор файла, который не является допустимым дескриптором открытого файла.

Страница руководства Linux для select (2) предоставляет дескриптор файла, который уже был закрыт, как конкретный пример плохого дескриптора файла. Однако , руководство по Linux также документирует ошибку, что Linux select() игнорирует FD в предоставленных fdsets, которые больше, чем любые, которые процесс в настоящее время имеет открытыми. Таким образом, в Linux вы не можете рассчитывать на сбой select() в вашем сценарии, но если select() не сбой, он никогда не выберет дескриптор файла, о котором идет речь.

1 голос
/ 06 марта 2019

POSIX select() требуется закрытый файловый дескриптор для генерации ошибки:

ОШИБКИ

При следующих условиях pselect() и select() должен завершиться с ошибкой и установить для errno значение:

[EBADF]
Один или несколько наборов дескрипторов файлов указали дескриптор файла, который не является допустимым дескриптором открытого файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...