Подтвердить что ты не робот

Почему выбор используется в Linux

Я проходил серийную программу, и я заметил, что они используют select() перед использованием read(). Почему именно это требуется. Почему мы не можем просто позвонить read() и проверить, не сработало или нет? Также почему нам нужно увеличивать файловый дескриптор на 1 и передавать его, пока я передаю уже установленный дескриптор файла select()?

Пример:

r=select(fd+1, &fds, NULL, NULL, &timeout);  где fds уже имеет значение fd

4b9b3361

Ответ 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