Обратите внимание, что срочные данные всегда появляются в начале данных, возвращенных вызовом функции sysread (). Это — не случайность. Дело в том, что АPI интерфейс обработки срочных данных предусматривает прекращение выполнении операций чтения на указателе срочных данных, даже если вызывающая процедура затребовала больший объем данных. При использовании встроенных данных следующим считанным функцией sysread ( ), будут сами срочные данные. При внеочередных данных следующим считанным байтом будет символ, который следует за срочными данными.
Функция select() для работы со срочными данными
Если вы предпочитаете не перехватывать сигнал URG, то для обнаружения срочных данных можете использовать функцию select () или роll (). При использовании функции select () срочные данные появляются как доступные “исключительные " данные, а при использовании функции poll () — как данные POLLPRI.
В листинге ниже представлена еще одна реализация сервера с обработкой данных на основе класса IO::Select. В этом примере сервер устанавливает два объекта IO::Select: для обычных операций чтения и для чтения срочных данных. Тем самым он определяет готовность этих данных к чтению с использованием метода IO::Select->select (). Если метод select () показывает, что доступны срочные данные, выполняется их выборка с использованием функции recv (). В ином случае - осуществляется чтение обычного потока данных с помощью функции sysread ().