ISSN 2305-5626. Вестник МГТУ им. Н.Э. Баумана: электронное издание. 2013
7
установлен, только если уже стоит второй флаг. Такая защита предна-
значена для использования внутри
select( )
, блокирование которого
не является ошибкой. Четвертый флаг показывает, что в процессе была
выполнена блокирующая запись. Поскольку состояния процесса рас-
сматриваются между двумя вызовами мультиплексирования, то вызов
select( )
сбрасывает все флаги и устанавливает первый флаг.
В ядре ОС сокет связан с процессом некоторым дескриптором.
Его структуру можно также расширить, добавив поле состояния, в
котором будет храниться текущее состояние сокета. Кроме того, в
ядре ОС имеется дескриптор сокета для системы, не связанный с
процессом. Его следует расширить флагом «Отслеживать мульти-
плексирование» и полем «Номер текущего процесса». Первый флаг
необходим, поскольку серверный сокет, созданный для приема вхо-
дящих соединений, может использоваться разными потоками, кото-
рым соответствуют различные дескрипторы задач.
Обнаружение ошибки происходит в системном вызове. В табл. 2
показано, какие из них отвечают за тот или иной тип ошибки. Вызов
select( )
должен определять два вида ошибок. В табл. 3 показаны
виды ошибок, признаки, позволяющие сделать вывод о возникнове-
нии ошибки, а также данные, используемые для ее выявления.
Таблица 2
Системные вызовы для обнаружения ошибок
Ошибка
Системные вызовы
Чтение из одного и того же сокета
в разных процессах или потоках
select( )
,
read( )
Блокирующее чтение
read( )
Блокирующая запись
write( )
Блокирование потока или процесса
до чтения из готового сокета
Невыполнение чтения данных между
вызовами функции мультиплексирования
select( )
Таблица 3
Обнаружение ошибок при вызове
select( )
Вид ошибки
Признак ошибки
Используемые данные
Чтение из одного и того
же сокета в разных
процессах или потоках
Сокет является клиент-
ским. Он обслуживает-
ся другим процессом
Уникальный дескрип-
тор сокета. Данные
системного вызова
Отсутствие чтения из
готового сокета между
вызовами
select( )
Сокет готов для чтения.
Находится не в состоя-
нии «Нет данных»
Дескриптор сокета.
Данные системного
вызова
1,2,3,4,5,6 8,9,10,11,12,13,14,15