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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

#include

int t_close(int fd);

где fdопределяет транспортный узел. Вызов этой функции приведет к освобождению ресурсов, связанных с транспортным узлом, а последующий системный вызов close(2) освободит и файловый дескриптор. Судьба виртуального канала (если таковой существует) зависит от того, является ли транспортный узел, адресующий данный канал, единственным. Если это так, соединение немедленно разрывается. В противном случае, например, когда несколько файловых дескрипторов адресуют один и тот же транспортный узел, виртуальный канал продолжает существовать.

Завершая разговор о программном интерфейсе TLI, необходимо упомянуть об обработке ошибок. Для большинства функций TLI свидетельством ошибки является получение -1 в качестве возвращаемого значения. Напротив, в случае нормального завершения эти функции возвращают 0. Как правило, при неудачном завершении функции TLI код ошибки сохраняется в переменной t_errno, подобно тому, как переменная errnoхранит код ошибки системного вызова. Для вывода сообщения, расшифровывающего причину ошибки, используется функция t_error(3N) :

#include

void t_error(const char *errmsg);

При вызове t_error(3N) после неудачного завершения какой-либо функции TLI будет выведено сообщение errmsg, определенное разработчиком программы, за которым последует расшифровка ошибки, связанной с кодом t_errno. Если значение t_errnoравно TSYSERR, то расшифровка представляет собой стандартное сообщение о системной ошибке, связанной с переменной errno.

В заключение в качестве иллюстрации программного интерфейса TLI приведем пример приложения клиент-сервер. Как и в предыдущих примерах, сервер принимает сообщения от клиента и отправляет их обратно. Клиент, в свою очередь, выводит полученное сообщение на экран. В качестве сообщения, как и прежде, выступает жизнерадостное приветствие "Здравствуй, мир!".

Сервер

#include

#include

#include

#include

#include

#include

#include

#include

/* Номер порта, известный клиентам */

#define PORTNUM 1500

main(argc, argv)

int argc;

char *argv[];

{

/* Дескрипторы транспортных узлов сервера */

int tn, ntn;

int pid, flags;

int nport;

/* Адреса транспортных узлов сервера и клиента */

struct sockaddr_in serv_addr, *clnt_addr;

struct hostent *hp;

char buf[80], hname[80];

struct t_bind req;

struct t_call *call;

/* Создадим транспортный узел. В качестве поставщика

транспортных услуг выберем модуль TCP */

if ((tn = t_open("/dev/tcp", O_RDWR, NULL)) == -1) {

t_error("Ошибка вызова t_open()");

exit(1);

}

/* Зададим адрес транспортного узла — он должен быть

известен клиенту */

nport = PORTNUM;

/* Приведем в соответствие порядок следования байтов для хоста

и сети */

nport = htons((u_short)nport);

bzero(&serv_addr, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = INADDR_ANY;

serv_addr.sin_port = nport;

req.addr.maxlen = sizeof(serv_addr);

req.addr.len = sizeof(serv_addr);

req.addr.buf = (char*)&serv_addr;

/* Максимальное число запросов, ожидающих обработки,

установим равным 5 */

req.qlen = 5;

/* Свяжем узел с запросом */

if (t_bind(tn, &req, (struct t_bind*)0) < 0) {

t_error("Ошибка вызова t_bind();

exit(1);

}

fprintf(stderr, "Адрес сервера: %s\n",

inet_ntoa(serv_addr.sin_addr));

/* Поскольку в структуре t_call нам понадобится только буфер

для хранения адреса клиента, разместим ее динамически */

if ((call =

(struct t_call*)t_alloc(tn, T_CALL, T_ADDR)) == NULL) {

t_error("Ошибка вызова t_alloc()");

exit(2);

}

call->addr.maxlen = sizeof(serv_addr);

call->addr.len = sizeof(srv_addr);

call->opt.len = 0;

call->update.len = 0;

/* Бесконечный цикл получения и обработки запросов */

while (1) {

/* Ждем поступления запроса на установление соединения */

if (t_listen(s, call) < 0) {

t_error("Ошибка вызова t_listen()");

exit(1);

}

/* Выведем информацию о клиенте, сделавшем запрос */

clnt_addr = (struct sockaddr_in*)call->addr.buf;

printf("Клиент: %s\n", inet_ntoa(clnt_addr->sin_addr));

/* Создадим транспортный узел для обслуживания запроса */

if (ntn = t_open("/dev/tcp", O_RDWR, (struct t_info*)0)) < 0) {

t_error("Ошибка вызова t_open()");

exit(1);

}

/* Пусть система сама свяжет его с подходящим адресом */

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

Интервал:

Закладка:

Сделать

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

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


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

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

x