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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

int sendto(int s, const char *msg, int len, int flags,

const struct sockaddr* toaddr, int tolen);

int recv(int s, char *buf, int len, int flags);

int recvfrom(int s, char *buf, int len, int flags,

struct sockaddr* fromaddr, int* fromlen);

Функции send(2) и sendto(2) используются для передачи данных удаленному узлу, а функции recv(2) и recvfrom(2) — для их приема. Основным различием между ними является то, что функции send(2) и recv(2) могут быть использованы только для "подсоединенного" сокета, т.е. после вызова connect(2) .

Все эти вызовы используют в качестве первого аргумента дескриптор сокета, через который производится обмен данными. Аргумент msgсодержит сообщение длиной len, которое должно быть передано по адресу toaddr, длина которого составляет tolenбайтов. Для функции send(2) используется адрес получателя, установленный предшествовавшим вызовом connect(2) . Аргумент bufпредставляет собой буфер, в который копируются полученные данные.

Параметр flagsможет принимать следующие значения:

MSG_OOB Передать или принять экстренные данные вместо обычных
MSG_PEEK Просмотреть данные, не удаляя их из системного буфера (последующие операции чтения получат те же данные)

Пример использования сокетов

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

В примере использованы сокеты датаграмм, которые в домене UNIX практически не отличаются от сокетов потока. В качестве адреса сервера предлагается имя файла ./echo.server(мы полагаем, что в системе запущен только один сервер из данного каталога). Предполагается, что клиенты заранее знают этот адрес. Сервер связывает созданный сокет с этим локальным адресом и таким образом регистрируется в системе. Начиная с этого момента он готов к получению и обработке сообщений. Сервер начинает бесконечный цикл, ожидая сообщений от клиентов, блокируясь на вызове recvfrom(2) . При получении сообщения сервер отправляет его обратно, вызывая sendto(2) .

Сервер:

#include

#include

#include

#define MAXBUF 256 char

buf[MAXBUF];

main() {

struct sockaddr_un serv_addr, clnt_addr;

int sockfd;

int saddrlen, caddrlen, max caddrlen, n;

/* Создадим сокет */

if ((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0} {

printf("Невозможно создать сокет\n");

exit(1);

}

/* Свяжем сокет с известным локальным адресом. Поскольку адрес

в домене UNIX представляет собой имя файла, который будет

создан системным вызовом bind(2), сначала удалим файл с этим

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

сервера */

unlink("./echo_server");

bzero(&serv_addr, sizeof(serv_addr));

serv_addr.sun_family = AF_UNIX;

strcpy(serv_addr.sun_path, "./echo.server");

saddrlen =

sizeof(serv_addr.sun_family) + strlen(serv_addr.sun_path);

if (bind(sockfd, (struct sockaddr*)&serv_addr,

saddrlen) < 0) {

printf("Ошибка связывания сокета с адресом\n");

exit(1);

}

/* Теперь запустим бесконечный цикл чтения сообщений от

клиентов и отправления их обратно */

max_caddrlen = sizeof(clnt_addr);

for(;;) {

caddrlen = max_caddrlen;

n = recvfrom(sockfd, buf, MAXBUF, 0,

(struct sockaddr*)&clnt_addr, &caddrlen);

if (n < 0) {

printf("Ошибка приема\n");

exit(1);

}

/* Благодаря вызову recvfrom(2), мы знаем адрес клиента,

от которого получено сообщение. Используем этот адрес

для передачи сообщения обратно отправителю */

if (sendto(sockfd, buf, n, 0,

(struct sockaddr*)&clnt_addr, caddrlen) != n) {

printf("Ошибка передачи\n");

exit(1);

}

}

}

Клиент создает сокет датаграмм и связывает его со своим уникальным адресом. Уникальность адреса определяется уникальностью имени файла. Поскольку одновременно могут работать несколько клиентов, возникает задача выполнения условия уникальности. Для этого мы используем функцию mktemp(3C) , позволяющую по заданному шаблону /tmp/clnt.XXXXи на основании идентификатора текущего процесса получить уникальное имя, заменяя соответствующим образом символы 'X'. Связывание сокета позволяет при отправлении сообщения неявно указать его "адрес отправителя", так что серверу не составляет труда отправить сообщение обратно.

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

Интервал:

Закладка:

Сделать

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

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


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

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

x