Не следует путать версию select () с четырьмя параметрами и версию с одним параметром, описанную ранее. Последняя применяется для выбора дескриптора файла, используемого по умолчанию с функцией print (). Подробное описание встроенной функции select () приведено в справочном руководстве perlfunk.
Определение готовности дескриптора файла к вводу-выводу.
Чтобы воспользоваться всеми преимуществами метода select ( ), важно понять, по каким правилам определяется готовность дескриптора к вводу-выводу. Подобное явление можно ярко проследить, например, при получении информации из сети про насосы grundfos . Некоторые из этих правил применяются в равной степени к обычным дескрипторам файлов, каналам и сокетам, а другие относятся только к сокетам.
Дескрипторы файлов, каналы и сокеты готовы для чтения при следующих условиях.
1) Дескриптор файла содержит данные, ожидающе обработки. Если во входном буфере дескриптора файла (приемного буфера в случае сокетов) содержится хотя бы один байт данных, метод select() указывает, что дескриптор файла готов для чтения. Функция sysread ( ), выполняемая с этим дескриптором файла, не блокируется и возвращает число считанных байтов.
Для сокетов это правило может быть изменено путем установки “нижней отметки” приемного буфера, как описано в следующем разделе.
2) Дескриптор файла содержит признак конца файла. Метод select () указывает, что дескриптор файла готов для чтения, если при выполнении следующей операции чтения будет возвращен признак конца файла. При следующем вызове функции sysread ( ) будет возвращено числовое значение 0 без блокировки. Такая ситуация в обычных дескрипторах файлов возникает при достижении конца файла, а в сокетах TCP — при закрытии соединения удаленным хостом.
3) Дескриптор файла содержит сообщение об ошибке, ожидающее обработки. В результате возникновения любой ошибки ввода-вывода в дескрипторе файла метод select () также указывает, что дескриптор готов для чтения, а функция sysread ( ) возвращает значение undef и устанавливает в переменной $! код ошибки.