Андрей Робачевский - Операционная система UNIX
- Название:Операционная система UNIX
- Автор:
- Жанр:
- Издательство:BHV - Санкт-Петербург
- Год:1997
- Город:Санкт-Петербург
- ISBN:5-7791-0057-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Андрей Робачевский - Операционная система UNIX краткое содержание
Книга посвящена семейству операционных систем UNIX и содержит информацию о принципах организации, идеологии и архитектуре, объединяющих различные версии этой операционной системы.
В книге рассматриваются: архитектура ядра UNIX (подсистемы ввода/вывода, управления памятью и процессами, а также файловая подсистема), программный интерфейс UNIX (системные вызовы и основные библиотечные функции), пользовательская среда (командный интерпретатор shell, основные команды и утилиты) и сетевая поддержка в UNIX (протоколов семейства TCP/IP, архитектура сетевой подсистемы, программные интерфейсы сокетов и TLI).
Для широкого круга пользователей
Операционная система UNIX - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Значение поля fields | Размещаемые и инициализируемые поля |
---|---|
T_ALL |
Все необходимые поля |
T_ADDR |
Поле addr в структурах t_bind , t_call , t_unitdata , t_uderr |
T_OPT |
Поле opt в структурах t_call , t_unitdata , t_uderr , t_optmgmt |
T_UDATA |
Поле udata в структурах t_call , t_unitdata , t_discon |
Отметим одну особенность. Фактический размер буфера и, соответственно, структуры netbuf
зависят от значения поля maxlen
этой структуры. В свою очередь, этот параметр зависит от конкретного поставщика транспортных услуг — именно он определяет максимальный размер адреса, опций и прикладных данных. Чуть позже мы увидим, что эта информация ассоциирована с транспортным узлом и может быть получена после его создания с помощью функции t_open(3N) . Поэтому для определения фактического размера размещаемых структур в функции t_аlloc(3N) необходим аргумент fd
, являющийся дескриптором транспортного узла, который возвращается процессу функцией t_open(3N) .
Перейдем к основным функциям TLI.
Как видно из рис. 6.18 и 6.19, в качестве первого этапа создания коммуникационного узла используется функция t_open(3N) . Как и системный вызов open(2) , она возвращает дескриптор, который в дальнейшем адресует узел в функциях TLI. Функция имеет вид:
#include
#include
int t_open(const char *path, int oflags, struct t_info *info);
Аргумент path
является именем специального файла устройства, являющегося поставщиком транспортных услуг, например, /dev/tcpили /dev/udp. Аргумент oflags
определяет флаги открытия файла и соответствует аналогичному аргументу системного вызова open(2) . Приложение может получить информацию о поставщике транспортных услуг в структуре info
, имеющей следующие поля:
addr |
Определяет максимальный размер адреса транспортного протокола. Значение -1 говорит, что размер не ограничен, -2 означает, что прикладная программа не имеет доступа к адресам протокола. Протокол TCP устанавливает размер этого адреса (адрес порта) равным 16. |
options |
Определяет размер опций для данного протокола. Значение -1 свидетельствует, что размер не ограничен, -2 означает, что прикладная программа не имеет возможности устанавливать опции протокола. |
tsdu |
Определяет максимальный размер пакета данных протокола (Transport Service Data Unit, TSDU). Нулевое значение означает, что протокол не поддерживает пакетную передачу (т.е. не сохраняет границы записей). Значение -1 свидетельствует, что размер не ограничен, -2 означает, что передача обычных данных не поддерживается. Поскольку протокол TCP обеспечивает передачу неструктурированного потока данных, значение tsdu для него равно 0. Напротив, UDP поддерживает пакетную передачу. |
etsdu |
Определяет максимальный размер пакета экстренных данных протокола (Expedited Transport Service Data Unit, ETSDU). Нулевое значение означает, что протокол не поддерживает пакетную передачу (т.е. не сохраняет границы записей). Значение -1 свидетельствует, что размер не ограничен, -2 означает, что передача экстренных данных не поддерживается. TCP обеспечивает такую поддержку, а UDP — нет. |
connect |
Некоторые протоколы допускают передачу прикладных данных вместе с запросом на соединение. Поле connect определяет максимальный размер таких данных. Значение -1 свидетельствует, что размер не ограничен, -2 означает, что данная возможность не поддерживается. И TCP и UDP не поддерживают этой возможности. |
discon |
Определяет то же, что и connect , но при запросе на прекращение соединения. И TCP и UDP не поддерживают этой возможности. |
servtype |
Определяет тип транспортных услуг, предоставляемых протоколом. Значение T_COTS означает передачу с предварительным установлением соединения, T_COTS_ORD — упорядоченную передачу с предварительным установлением соединения, T_CLTS — передачу без предварительного установления соединения. Протокол TCP обеспечивает услугу T_COTS_ORD , a UDP — T_CLTS . |
Прежде чем передача данных будет возможна, транспортному узлу должен быть присвоен адрес. Эта фаза называется операцией связывания и мы уже сталкивались с ней при разговоре о сокетах в главе 3 и при обсуждении сетевой поддержки в BSD UNIX ранее в этой главе. В рассмотренных случаях связывание выполнял вызов bind(2) . В TLI для этого служит функция t_bind(3N) , имеющая вид:
#include
int t_bind(int fd, const struct t_bind *req,
struct t_bind *ret);
Аргумент fd
адресует коммуникационный узел. Аргумент req
позволяет программе явно указать требуемый адрес, а через аргумент ret
возвращается значение, установленное протоколом.
Два последних аргумента описываются структурой t_bind
, имеющей следующие поля:
struct netbuf addr |
Адрес |
unsigned qlen |
Максимальное число запросов на установление связи, которые могут ожидать обработки. Имеет смысл только для протоколов с предварительным установлением соединения |
Рассмотрим три возможных формата аргумента req
:
req == NULL |
Позволяет поставщику транспортных услуг самому выбрать подходящий адрес |
req != NULL req->addr.len == 0 |
Позволяет поставщику транспортных услуг самому брать подходящий адрес, но определяет максимальное число запросов на установление связи, которые могут ожидать обработки |
req != NULL req->addr.len > 0 |
Явно указывает требуемый адрес и максимальное число запросов на установление связи, которые могут ожидать обработки |
Во всех случаях фактическое значение адреса возвращается в структуре ret
. Даже если программа явно указала требуемый адрес, необходимо проверить, совпадает ли он с адресом, указанным в ret
.
Для протоколов с предварительным установлением соединения программе-клиенту необходимо использовать функцию t_connect(3N) , отправляющую запрос на создание соединения с удаленным транспортным узлом. Функция t_connect(3N) имеет вид:
#include
int t_connect(int fd, const struct t_call* sndcall,
struct t_call *rcvcall);
Аргумент sndcall
содержит информацию, необходимую поставщику транспортных услуг для создания виртуального канала. Формат этой информации описывается структурой t_call
, имеющей следующие поля:
struct netbuf addr |
Адрес удаленного транспортного узла |
struct netbuf opt |
Требуемые опции протокола |
struct netbuf udata |
Прикладные данные, отправляемые вместе с управляющей информацией (запрос на установление соединения или подтверждение) |
int sequence |
В данном случае не имеет смысла |
Через аргумент revcall
программе возвращается информация о виртуальном канале после его создания: адрес удаленного узла, опции и прикладные данные, переданные удаленным узлом. Как уже отмечалось, ни TCP, ни UDP не позволяют передавать данные вместе с управляющей информацией. Программа может установить значение rcvcall
равным NULL
, если информация о канале ее не интересует.
Интервал:
Закладка: