Андрей Робачевский - Операционная система UNIX

Здесь есть возможность читать онлайн «Андрей Робачевский - Операционная система UNIX» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Санкт-Петербург, Год выпуска: 1997, ISBN: 1997, Издательство: BHV - Санкт-Петербург, Жанр: ОС и Сети, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Операционная система UNIX: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Операционная система UNIX»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Книга посвящена семейству операционных систем UNIX и содержит информацию о принципах организации, идеологии и архитектуре, объединяющих различные версии этой операционной системы.
В книге рассматриваются: архитектура ядра UNIX (подсистемы ввода/вывода, управления памятью и процессами, а также файловая подсистема), программный интерфейс UNIX (системные вызовы и основные библиотечные функции), пользовательская среда (командный интерпретатор shell, основные команды и утилиты) и сетевая поддержка в UNIX (протоколов семейства TCP/IP, архитектура сетевой подсистемы, программные интерфейсы сокетов и TLI).
Для широкого круга пользователей

Операционная система UNIX — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Операционная система UNIX», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Рассмотренный ранее программный интерфейс TLI полностью реализует функциональность TPI. Легко заметить соответствие между отдельными функциями TLI и примитивами TPI, приведенными в табл. 6.10. Схема вызова функций TPI и обмена соответствующими примитивами TPI между клиентом и сервером для типичного TCP-сеанса приведена на рис. 6.32.

Рис 632 Функции TLI и примитивы TPI Программный интерфейс потоков был - фото 121

Рис. 6.32. Функции TLI и примитивы TPI

Программный интерфейс потоков был рассмотрен в главе 5 при обсуждении подсистемы STREAMS. Основными функциями, обеспечивающими передачу и получение сообщений, являются системные вызовы putmsg(2) и getmsg(2) . Таким образом, большинство функций TLI, составляющих программный интерфейс доступа прикладных процессов к транспортным протоколам, являются удобной оболочкой (реализованной в виде библиотеки, например, libnsl.so) более фундаментальным системным вызовам putmsg(2) и getmsg(2) .

В качестве примера рассмотрим функцию t_connect(3N ). Ее реализация может иметь следующий вид:

int t_connect(int fd, struct t_call *sndcall,

struct t_call *recvcall) {

struct T_conn_req *connreq;

struct T_conn_con* conncon;

struct T_ok_ack *okack;

struct T_error_ack *errack;

struct strbuf connect, ack, confirm, m_data;

struct netbuf addr, opt, udata;

char *buf;

int flags;

...

/* Сохраним адреса буферов netbuf запроса sndcall */

addr = sndcall->addr; opt = sndcall->opt;

udata = sndcall->udata;

/* Заполним поля структуры strbuf для формирования

управляющей части (блок M_PROTO) сообщения T_CONN_REQ */

connect.len =

sizeof(struct T_conn_req) + addr.len + opt.len;

connect.maxlen =

sizeof(struct Т_conn_req) + addr.maxlen + opt.maxlen;

buf = (char*)malloc(connect.maxlen);

connect.buf = buf;

/* Заполним поля заголовка блока M_PROTO сообщения T_CONN_REQ в

соответствии с форматом структуры T_conn_req */

connreq = (struct T_conn_req*)buf;

connreq->PRIM_type = T_CONN_REQ;

connreq->DEST_length = addr.len;

connreq->DEST_offset = sizeof (struct T_conn_req);

buf += sizeof(struct T_conn_req);

memcpy(buf, addr.buf, addr.len);

connreq->OPT_length = opt.len;

connreq->OPT_offset = connreq->DEST_offset + opt.len;

buf += addr.len;

memcpy(buf, opt.buf, opt.len);

/* Заполним поля структуры strbuf для формирования блока данных

(блок M_DATA) */

m_data.len = udata.len;

m_data.maxlen = udata.maxlen;

m_data.buf = udata.buf;

/* Отправим запрос Т_CONN_REQ поставщику транспортных услуг

по потоку fd */

putmsg(fd, &connect, &m_data, 0);

/* Подготовимся к приему подтверждения. Выделим максимальный

размер для получения негативного подтверждения, поскольку

примитив T_ERROR_ACK занимает больше места */

ack.len = ack.maxlen = sizeof(struct T_error_ack);

ack.buf = udata.buf;

/* Подтверждение является приоритетным, поэтому установим флаг

RS_HIPRI. До получения подтверждения не предпринимаем

никаких действий */

flags = RS_HIPRI;

getmsg(fd, &ack, (struct strbuf*)0, &flags);

free(connect.buf);

okack = (struct T_ok_ack*)ack.buf;

/* Проверим получено ли положительное или

негативное подтверждение */

if (okack->PRIM_type == T_OK_ACK) {

/* Если подтверждение положительное, подготовимся к получению

согласия удаленного пользователя на установление связи

(примитив T_CONN_CON) */

free(ack.buf);

if (recvcall != NULL) {

addr = recvcall->addr;

opt = recvcall->opt;

udata = recvcall->udata;

confirm.len = sizeof(struct T_conn_con) + addr.len + opt.len;

confirm.maxlen =

sizeof(struct T_conn_con) + addr.maxlen + opt.maxlen;

buf = (char*)malloc(confirm.maxlen);

confirm.buf = buf;

m_data.len = udata.len;

m_data.maxlen = udata.maxlen;

m_data.buf = udata.buf;

/* Получим примитив T_CONN_CON */

getmsg(fd, &confirm, &m_data, &flags);

free(buf);

conncon = (struct T_conn_con*)confirm.buf;

if (conncon->PRIM_type == T_CONN_CON) {

/* Если это действительно согласие, заполним

структуру rcvcall для пользователя TLI */

addr.len = conncon->OPT_length;

opt.len = conncon->OPT_length;

memcpy(addr.buf, conncon+conncon->RES_offset, addr.len);

memcpy(opt.buf, conncon+conncon->OPT_offset, opt.len);

free(confirm.buf);

/* Все закончилось удачно — возвращаем 0 */

return 0;

}

} else {

/* В случае отказа мы готовы обработать примитив

T_DISCON_IND */

...

return -1;

}

} else {

/* Если получен примитив T_ERROR_ACK — обработаем его */

errack = (struct T_error_ack*)ack.buf;

...

return -1;

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Операционная система UNIX»

Представляем Вашему вниманию похожие книги на «Операционная система UNIX» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Операционная система UNIX»

Обсуждение, отзывы о книге «Операционная система UNIX» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x