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

Тут можно читать онлайн Андрей Робачевский - Операционная система UNIX - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство BHV - Санкт-Петербург, год 1997. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Операционная система UNIX
  • Автор:
  • Жанр:
  • Издательство:
    BHV - Санкт-Петербург
  • Год:
    1997
  • Город:
    Санкт-Петербург
  • ISBN:
    5-7791-0057-8
  • Рейтинг:
    4.63/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

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

Операционная система UNIX - описание и краткое содержание, автор Андрей Робачевский, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Книга посвящена семейству операционных систем UNIX и содержит информацию о принципах организации, идеологии и архитектуре, объединяющих различные версии этой операционной системы.

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

Для широкого круга пользователей

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

Операционная система UNIX - читать книгу онлайн бесплатно, автор Андрей Робачевский
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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);

}

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

if (t_bind(ntn, (struct t_bind*)0), (struct t_bind*)0) < 0) {

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

exit(1);

}

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

транспортный узел */

if (t_accept(tn, ntn, call) < 0) {

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

exit(1);

}

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

При этом родительский процесс продолжает принимать

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

if ((pid = fork()) == -1) {

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

exit(1);

}

if (pid == 0) {

int nbytes;

/* Дочерний процесс: этот транспортный узел уже не нужен,

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

close(tn);

while ((nbytes = t_rcv(ntn, buf,

sizeof(buf), &flags)) != 0) {

t_snd(ntn, buf, sizeof(buf), 0);

}

t_close(ntn);

exit(0);

}

/* Родительский процесс: этот транспортный узел не нужен,

он используется дочерним процессом для обмена данными

с клиентом */

t_close(ntn);

}

t_close(ntn);

}

Клиент

#include

#include

#include

#include

#include

#include

#include

#include

#define PORTNUM 1500

main(argc, argv)

char *argv[];

int argc;

{

int tn;

int flags;

struct sockaddr_in serv_addr;

struct hostent *hp;

char buf[80]="Здравствуй, мир!";

struct t_call* call;

/* В качестве аргумента клиенту передается доменное имя хоста,

на котором запущен сервер. Произведем трансляцию доменного

имени в адрес */

if ((hp = gethostbyname(argv[1])) == 0) {

perror("Ошибка вызова gethostbyname()");

exit(1);

}

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

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

printf("Сервер готов\n");

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

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

exit(1);

}

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

подходящим адресом */

if (t_bind(tn, (struct t_bind*)0,

(struct t_bind *)0) < 0} {

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

exit(1);

}

fprintf(stderr, "Адрес клиента: %s\n",

inet_ntoa(serv_addr.sin_addr));

/* Укажем адрес сервера, с которым мы будем работать */

bzero(&serv_addr, sizeof(serv_addr));

bcopy(hp->h_addr, &serv_addr.sin_addr, hp->h_length);

serv_addr.sin_family = hp->h_addrtype;

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

для хоста и сети */

serv_addr.sin_port = htons(PORTNUM);

/* Поскольку в структуре 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(serv_addr);

call->addr.buf = (char*)&serv_addr;

call->opt.len = 0;

call->udata.len = 0;

/* Установи соединение с сервером */

if (t_connect(tn, call, (struct t_call*)0) == -1) {

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

exit(1);

}

/* Передадим сообщение и получим ответ */

t_snd(tn, buf, sizeof(buf), 0);

if (t_rcv(tn, buf, sizeof(buf), &flags) < 0) {

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

exit(1);

}

/* Выведем полученное сообщение на экран */

printf("Получено от сервера: %s\n", buf);

printf("Клиент завершил работу!\n\n");

}

В рассмотренном примере большая часть исходного текста посвящена созданию транспортных узлов и установлению соединения, в то время как завершение сеанса связи представлено скупыми вызовами t_close(3N) . На самом деле, вызов t_close(3N) приводит к немедленному разрыву соединения, запрещая дальнейшую передачу или прием данных. Однако виртуальный канал, обслуживаемый протоколом TCP, является полнодуплексным и, как было показано, TCP предусматривает односторонний разрыв связи, позволяя другой стороне продолжать передачу данных. Действиям, предписываемым TCP, больше соответствуют две функции t_sndrel(3N) и t_rcvrel(3N) , которые обеспечивают "корректное "прекращение связи (orderly release). Разумеется, эти рассуждения справедливы лишь для транспортного протокола, обеспечивающего передачу данных с предварительным установлением связи, каковым, в частности, является протокол TCP.

Функции t_sndrel(3N) и t_rcvrel(3N) имеют вид:

#include

int t_sndrel(int fd);

int t_rcvrel(int fd);

Вызывая функцию t_sndrel(3N) , процесс отправляет другой стороне уведомление об одностороннем прекращении связи, это означает, что процесс не намерен больше передавать данные. В то же время процесс может принимать данные — файловый дескриптор fdдоступен для чтения.

Другая сторона подтверждает получение уведомления вызовом функции t_rcvrel(3N) . Однако поскольку получение такого уведомления носит асинхронный характер, процесс должен каким-то образом узнать, что запрос поступил. Такой индикацией является завершение с ошибкой попытки получения данных от удаленного узла, например, с помощью функции t_rcv(3N) . В этом случае вызов функции t_rcv(3N) завершится с ошибкой TLOOK.

Эта ошибка свидетельствует, что произошло событие, связанное с коммуникационным узлом, анализ которого позволяет получить дополнительную информацию о причине неудачи. Текущее событие может быть получено с помощью функции t_look(3N) :

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

Интервал:

Закладка:

Сделать


Андрей Робачевский читать все книги автора по порядку

Андрей Робачевский - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Операционная система UNIX, автор: Андрей Робачевский. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x