Самодел 2003 (1114718), страница 15

Файл №1114718 Самодел 2003 (Старые версии Машбука или нечто подобное) 15 страницаСамодел 2003 (1114718) страница 152019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 15)

// запуск бесконечного цикла

while(1) { printf(“Введите строку:”);

if ((str = gets(str)) == NULL) break;

sops.sem_op=0; // ожидание обнуления семафора

semop(semid, &sops, 1);

strcpy(shmaddr, str); // копируем строку в разд. память

sops.sem_op=3; // увеличение семафора на 3

semop(semid, &sops, 1);

}

shmaddr[0]=’Q’; // укажем 2-ому процессу на то,

sops.sem_op=3; // что пора завершаться

semop(semid, &sops, 1);

sops.sem_op = 0; // ждем, пока обнулится семафор

semop(semid, &sops, 1);

shmdt(shmaddr); // отключаемся от разд. памяти

semctl(semid, 0, IPC_RMID, (union semun) 0); // убиваем семафор

shmctl(shmid, IPC_RMID, NULL); // уничтожаем разделяемую память

exit(0); }

2й процесс:

/* здесь нам надо корректно определить существование ресурса, если он есть - подключиться, если нет - сделать что-то еще, но как раз этого мы делать не будем */

#include <stdio.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int main(void)

{ key_t key; int semid;

struct sembuf sops;

char *shmaddr;

char st=0;

// далее аналогично предыдущему процессу - инициализации ресурсов

semid = semget(key,1,0666 | IPC_CREAT);

shmid = shmget(key,256, 0666 | IPC_CREAT);

shmaddr = shmat(shmid, NULL, 0);

sops.sem_num = 0; sops.sem_flg = 0;

// запускаем цикл

while(st!=’Q’) {

printf(“Ждем открытия семафора \n”);

// ожидание положительного значения семафора

sops.sem_op=-2;

semop(semid, &sops, 1);

// будем ожидать, пока “значение семафора”+”значение sem_op” не перевалит за

0, то есть если придет “3”, то “3-2=1”

// теперь значение семафора равно 1

st = shmaddr[0];

{ /*критическая секция - работа с разделяемой памятью - в этот момент

первый процесс к разделяемой памяти доступа не имеет*/}

/* после работы - закроем семафор */

sem.sem_op=-1;

semop(semid, &sops, 1);

// вернувшись в начало цикла мы опять будем ждать, пока значение семафора не станет больше нуля

}

shmdt(shmaddr); // освобождаем разделяемую память и выходим

exit(0);

}

Механизм сокетов

Средства межпроцессного взаимодействия ОС Unix, представленные в системе IPС, решают проблему взаимодействия двух процессов, выполняющихся в рамках одной операционной системы.

Но необходимы:

• Унифицированный механизм, позволяющий использовать одни и те же подходы для локального и нелокального взаимодействия.

• Общий интерфейс, позволяющий пользоваться услугами различных протоколов по выбору пользователя.

Эти проблемы решает механизм сокетов (sockets)

Сокеты подразделяются на несколько типов в зависимости от типа коммуникационного соединения, который они используют. Два основных типа коммуникационных соединений и, соответственно, сокетов представляет собой соединение с использованием виртуального канала и датаграммное соединение.

1)

Соединение с использованием виртуального канала (TCP) – это последовательный поток байтов, гарантирующий надежную доставку сообщений с сохранением порядка их следования. Данные начинают передаваться только после того, как виртуальный канал установлен, и канал не разрывается, пока все данные не будут переданы. Примером соединения с установлением виртуального канала является механизм каналов в UNIX, аналогом такого соединения из реальной жизни также является телефонный разговор. Заметим, что границы сообщений при таком виде соединений не сохраняются, т.е. приложение, получающее данные, должно само определять, где заканчивается одно сообщение и начинается следующее. Такой тип соединения может также поддерживать передачу экстренных сообщений вне основного потока данных, если это возможно при использовании конкретного выбранного протокола.

2) Датаграммное соединение (UDP) используется для передачи отдельных пакетов, содержащих порции данных – датаграмм. Для датаграмм не гарантируется доставка в том же порядке, в каком они были посланы. Вообще говоря, для них не гарантируется доставка вообще, надежность соединения в этом случае ниже, чем при установлении виртуального канала. Однако датаграммные соединения, как правило, более быстрые. Примером датаграммного соединения из реальной жизни может служить обычная почта: письма и посылки могут приходить адресату не в том порядке, в каком они были посланы, а некоторые из них могут и совсем пропадать.

Поскольку сокеты могут использоваться как для локального, так и для удаленного взаимодействия, встает вопрос о пространстве адресов сокетов. При создании сокета указывается т.н. коммуникационный домен, к которому данный сокет будет принадлежать. Коммуникационный домен определяет форматы адресов и правила их интерпретации. Мы будем рассматривать два основных домена:

  • домен AF_UNIX для локального взаимодействия

  • домен AF_INET для взаимодействия в рамках сети (префикс AF обозначает сокращение от address family – семейство адресов).

В домене AF_UNIX формат адреса – это допустимое имя файла, в домене AF_INET адрес образуют имя хоста + номер порта.

Далее мы рассмотрим принципиальный набор функций, которые предоставляются для работы с сокетами.

Для использования всех приведенных далее функций необходимо подключить следующие include-файлы:

#include <sys/types.h>

#include <sys/socket.h>

1) Создание сокета

int socket (int domain, int type, int protocol);

domain – константа, определяющая коммуникационный домен, который будет использоваться для взаимодействия, в частности значение AF_UNIX определяет домен локального межпроцессного взаимодействия внутри одной UNIX-системы, а значение AF_INET соответствует домену взаимодействия удаленных систем с использованием TCP/IP.

type определяет тип соединения (сокета). В частности type может принимать значения SOCK_STREAM, что соответствует сокету потока или виртуального канала, и SOCK_DGRAM, если мы хотим установить датаграммное соединение.

protocol – код протокола, который будет использоваться для взаимодействия. Значение IPPROTO_TCP используют, если тип сокета – виртуальный канал, IPPROTO_UDP – если речь идет о датаграммном сокете. Если protocol=0, то система сама подберет подходящий протокол.

Функция возвращает дескриптор сокета - некоторое положительное число в случае успешной работы и «-1» в случае возникновения проблем (в errno – причина).

2) Функция связывания

int bind(int sockfd, struct sockaddr * myaddr, int sizeaddr);

где sockfd – дескриптор сокета, который вернула функция socket.

sizeaddr – размер той структуры в байтах, на которую указывает второй аргумент (myaddr). Использование этого аргумента обусловлено тем, что реально в зависимости от домена форматы структур могут быть разными, например, в файле sys/un.h:

struct sockaddr_un

{

short sun_family; // Код домена, в частности AF_UNIX

char sun_path[108]; // имя файла, с которым будет связан адрес

}

Суть работы: мы создали сокет и получили дескриптор сокета. Нам хотелось бы иметь возможность обращаться к этому сокету извне: из других процессов или даже других машин. Система предоставляет возможность связывания конкретного сокета с некоторым адресом.

Связывание необходимо для серверных программ и иногда используется в клиентских приложениях.

Функция bind возвращает «0» в случае успеха и «-1» в случае ошибки.

2) Функция предварительного соединения

int connect (int sockfd, struct sockaddr *servaddr, int addrlen);

где sockfd – дескриптор сокета.

servaddr – указатель на структуру, содержащую адрес сокета-сервера.

addrlen – длина структуры, содержащей адрес.

Суть дела состоит в том, что имеются разновидности сокетов с предварительной установкой соединения и без нее. Предварительная установка соединения требует наличия как клиента, так и сервера. Соответственно если тип сокета виртуальный канал, то предварительное соединение обязано иметь место. Если же тип соединения датаграмма, то можно обойтись и без предварительного соединения

Соединение осуществляется от имени клиента, т. е. в рамках сервера происходит регистрация того факта, что имеется клиент – сокет, который будет работать с сервером. Обращаю Ваше внимание, что установка соединения имеет смысл для домена INET.

3)Функции прослушивания сокета и подтверждения соединения

Рассмотрим серверные функции:

  1. int listen (int sockfd, int backlog);

где sockfd – дескриптор сокета.

banklog – декларирование длины очереди запросов, которая будет ассоциирована с данным сокетом. Эта длина определяет количество необработанных запросов, понятно, что это число аккумулируется с ростом числа необработанных запросов, и может сложиться ситуация, когда свободного места для очередного необработанного запроса не будет. Так вот, реакция системы на факт исчерпания места зависит от типа используемого протокола.

Обращение к этой функции говорит о том, что процесс-сервер готов принимать запросы от клиентов, готов к работе с клиентами. До обращения к этой функции любой запрос к серверу не будет успешным.

  1. функция подтверждения соединения.

int accept (int sockfd, struct sockaddr *clntaddr, int *addrlen);

где sockfd – дескриптор сокета.

clntaddr – указатель на структуру, в которой указан адрес клиента.

addrlen – указатель на целочисленную переменную, содержащую длину адреса (фактически, длину структуры sockaddr).

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

  1. read/write – полностью аналогичны работе с файлами, но только вместо файлового дескриптора будет дескриптор сокета. Например, write в сервере может работать с тем дескриптором сокета, который вернула функция accept, а в клиенте – с дескриптором, который вернула функция connect.

  2. send/recv и sendto/recvfrom – реально эти функции Вы посмотрите сами в доступной литературе. В общем то, эти функции аналогичны read/write.

4) Функции закрытия сокета

  1. close – полная аналогия с работой с файлами, но аргумент – дескриптор сокета.

  2. int shutdown (int sd, int mode);

где sd – дескриптор сокета.

mode – некий модификатор, который определяет вариации закрытия сокета:

  • на получение информации;

  • на передачу информации;

  • совсем.



Пример работы с сокетами в рамках сети.

В качестве примера работы с сокетами в домене AF_INET напишем простой web-сервер, который будет понимать только одну команду :

GET /<имя файла>

Сервер запрашивает у системы сокет, связывает его с адресом, считающимся известным, и начинает принимать клиентские запросы. Для обработки каждого запроса порождается отдельный потомок, в то время как родительский процесс продолжает прослушивать сокет. Потомок разбирает текст запроса и отсылает клиенту либо содержимое требуемого файла, либо диагностику (“плохой запрос” или “файл не найден”).

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/stat.h>

#include <netinet/in.h>

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <unistd.h>

#define PORTNUM 8080

#define BACKLOG 5

#define BUFLEN 80

#define FNFSTR "404 Error File Not Found "

#define BRSTR "Bad Request "

int main(int argc, char **argv)

{

struct sockaddr_in own_addr, party_addr;

int sockfd, newsockfd, filefd;

Характеристики

Тип файла
Документ
Размер
2,4 Mb
Тип материала
Высшее учебное заведение

Список файлов лекций

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6381
Авторов
на СтудИзбе
308
Средний доход
с одного платного файла
Обучение Подробнее