Почему выбор используется в Linux
Я проходил серийную программу, и я заметил, что они используют select()
перед использованием read()
. Почему именно это требуется. Почему мы не можем просто позвонить read()
и проверить, не сработало или нет? Также почему нам нужно увеличивать файловый дескриптор на 1 и передавать его, пока я передаю уже установленный дескриптор файла select()
?
Пример:
r=select(fd+1, &fds, NULL, NULL, &timeout);
где fds уже имеет значение fd
Ответы
Ответ 1
Системный вызов select()
сообщает вам, есть ли какие-либо данные для чтения по интересующим вас файловым дескрипторам. Собственно, вопрос заключается в том, заблокирует ли операция чтения файлового дескриптора или нет.
Если вы выполняете read()
для файлового дескриптора - такого как тот, который подключен к последовательному порту - и нет данных для чтения, то вызов будет зависать, пока не будет данных для чтения. Программы, использующие select()
, не хотят, чтобы их так блокировали.
Вы также спрашиваете:
Почему мы должны увеличивать дескриптор файла на 1 и передавать его, когда я передаю дескриптор файла, уже установленный в select
?
Это, вероятно, указав размер FD_SET. Первый аргумент select()
известен как nfds
, а POSIX говорит:
Аргумент nfds
указывает диапазон дескрипторов для тестирования. Первые дескрипторы nfds
должны проверяться в каждом наборе; то есть дескрипторы от нуля до nfds-1
в наборах дескрипторов должны быть проверены.
Итак, чтобы проверить дескриптор файла n
, значение в nfds
должно быть не менее n+1
.
Ответ 2
Программы, которые хотят продолжить работу, в то же время читая интерактивный пользовательский ввод 1, должны быть многопоточными, или они должны внимательно читать потоки ввода и, в частности, условно.
Select(2)
можно использовать для реализации второго шаблона проектирования. Он может определить, можно ли читать ввод, не блокируя все приложение.
1. Or some other input that arrives unpredictably.
Ответ 3
Вы используете select call, когда вам приходится постоянно контролировать файловые дескрипторы, пока они не будут готовы к некоторому IO без блокировки.
Обычно, когда вы хотите, чтобы IO (например, read()) не блокировался, прочитайте: man page
Также читайте связанные API API