НАЗВАНИЕ
tirdwr - модуль псевдоустройства интерфейса ввода/вывода для Транспортного Интерфейса
ОПИСАНИЕ
Tirdwr - это модуль псевдоустройства, обеспечивающий
дополнительный интерфейс к транспортному протоколу, выполняющему функции Транспортного Интерфейса библиотеки
сетевых услуг. Этот дополнительный интерфейс дает возможность пользователю взаимодействовать с транспортным
протоколом с помощью системных вызовов read(2) и
write(2). Системные вызовы putmsg(2) и getmsg(2) при
этом можно использовать только для обмена данными между
пользователем и потоком.
Модуль tirdwr должен использоваться в потоке, который
завершается модулем транспортного протокола, обеспечивающим Транспортный Интерфейс [см. I_PUSH в
streamio(7)]. После того, как модуль tirdwr помещается
в поток, функции Транспортного Интерфейса становятся
недоступными, попытка обращения к какой-нибудь функции
Транспортного Интерфейса вызывает ошибку в потоке, при
этом все последующие обращения к потоку заканчиваются
неудачей, а переменной errno присваивается значение
EPROTO.
Ниже описываются действия, которые выполняет модуль
tirdwr, когда его помещают в поток [см. I_PUSH в
streamio(7)], удаляют из потока [см. I_POP в
streamio(7)], а также при прохождении через него данных.
Помещение модуля в поток
Когда модуль tirdwr помещается в поток, он выполняет проверку всех существующих сообщений для данного пользователя, чтобы гарантировать их полноту
и целостность. Игнорируются все сообщения, влияющие на управление процессами, например, сообщения,
генерирующие сигналы процессам, связанным с потоком. Если обнаруживается какое-нибудь другое сообщение, I_PUSH завершается неудачей, а переменной
errno присваивается значение EPROTO.
Запись в поток
Модуль tirdwr выполняет следующие действия над
данными, записываемыми в поток с помощью системного вызова write(2):
Все сообщения, имеющие область данных нулевой
длины, удаляются из потока и вниз не передаются.
Все остальные сообщения, за исключением тех,
которые содержат управляющую область [см.
putmsg(2) и getmsg(2)], без изменений передаются вниз соседнему модулю потока.
Все сообщения, имеющие управляющую область, вызывают ошибку в потоке, при этом все последующие обращения к потоку заканчиваются неудачей,
а переменной errno присваивается значение
EPROTO.
Чтение из потока
Модуль tirdwr выполняет следующие действия над
данными, поступающими от модуля транспортного протокола:
Все сообщения, за исключением тех, которые содержат управляющую область [см. putmsg(2) и
getmsg(2)], без изменений передаются вверх соседнему модулю потока.
Все сообщения, имеющие область данных нулевой
длины, удаляются из потока и вверх не передаются.
Сообщения, имеющие управляющую область, вызывают следующие действия:
Сообщения, задающие ускоренную передачу,
вызывают ошибку в потоке, при этом все
последующие обращения к потоку заканчиваются неудачей, а переменной errno присваивается значение EPROTO.
В сообщениях, имеющих и управляющую область, и область данных, перед передачей
сообщения наверх соседнему модулю управляющая область удаляется.
Сообщение от модуля транспортного протокола, свидетельствующее о нормальном завершении соединения, сгенерирует сообщение с
пустой управляющей областью и областью
данных нулевой длины, представляющее конец
файла. Это сообщение посылается пользователю, читающему из потока. Само сообщение
о нормальном завершении соединения удаляется из потока.
Сообщение от модуля транспортного протокола, свидетельствующее об аварийном завершении соединения, приводят к тому, что все
последующие обращения к потоку с помощью
системных вызовов write(2) и putmsg(2) заканчиваются неудачей с присваиванием переменной errno значения ENXIO. Обращения к
потоку с помощью системных вызовов read(2)
и getmsg(2), после того, как все имеющиеся
данные будут считаны, вернут сообщение с
областью данных нулевой длины, представляющее конец файла.
Все остальные сообщения с непустой управляющей областью вызывают ошибку в потоке,
при этом все последующие обращения к потоку заканчиваются неудачей, а переменной
errno присваивается значение EPROTO.
Удаление модуля из потока
Когда модуль tirdwr удаляется из потока, а также
при закрытии потока выполняются следующие действия:
Если ранее было получено сообщение, свидетельствующее о нормальном завершении соединения,
на удаленную сторону соединения на транспортном уровне посылается сообщение о нормальном
завершении соединения.
Если ранее было получено сообщение, свидетельствующее об аварийном завершении соединения,
не делается ничего.
Если сообщений о завершении соединения получено не было, на удаленную сторону соединения на
транспортном уровне посылается сообщение об
аварийном завершении соединения.
Если в потоке обнаружена ошибка и ранее было
получено сообщение, свидетельствующее об аварийном завершении соединения, на удаленную
сторону соединения на транспортном уровне посылается сообщение об аварийном завершении соединения.