Как select () возвращает что-либо кроме -1, 0 или 1? - PullRequest
2 голосов
/ 24 января 2020

Это определенно просто глупое недоразумение с моей стороны, но страница man для select () гласит:

Аргумент timeout указывает интервал, который select () должен блокировать в ожидании файлового дескриптора. быть готовым Вызов будет блокироваться до тех пор, пока:

* дескриптор файла не станет готовым;

* вызов прерван обработчиком сигнала; или

* истекло время ожидания.

И, кроме того,

В случае успеха select () и pselect () возвращают количество файловых дескрипторов содержится в трех возвращенных наборах дескрипторов (то есть общем количестве битов, которые установлены в readfds, writefds, кроме fds), которые могут быть равны нулю, если время ожидания истекает до того, как произойдет что-либо интересное. При ошибке возвращается -1, а errno устанавливается для указания ошибки; наборы файловых дескрипторов не изменяются, и время ожидания становится неопределенным.

Поэтому мой вопрос - если он прекратит блокировку, как только файловый дескриптор будет готов, не вернется ли он сразу 1? И если ни один fds не будет готов, он возвращает 0, в противном случае ошибка и возвращает -1.

Очевидно, что на практике он возвращает больше 1: весь смысл в том, что вы должны иметь возможность читать / записывать несколько fds, верно

1 Ответ

3 голосов
/ 24 января 2020

Благодаря тому, как работает современная вытесняющая многозадачность, несколько дескрипторов могут быть готовы до того, как ваш процесс будет активирован, а вызовы select подсчитывают дескрипторы.

...