Главная » Просмотр файлов » Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов

Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов (1114927), страница 18

Файл №1114927 Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов (Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов) 18 страницаН.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов (1114927) страница 182019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

(Однако, если такое сообщение существует, но егодлина превышает указанную в аргументе msgsz, то процессзаблокирован не будет, и вызов сразу вернет –1. Сообщение приэтом останется в очереди). Если же флаг IPC_NOWAIT указан, товызов сразу вернет –1.Процесс может также указать флаг MSG_NOERROR – в этомслучае он может прочитать сообщение, даже если его длинапревышает указанную емкость буфера. В этом случае в буфер будет105записано первые msgsz байт из тела сообщения, а остальные данныеотбрасываются.В случае удачного чтения возвращаемое значение вызоваравно 0.6.2.4 Управление очередью сообщений.Функция управленияследующим образом:очередьюсообщенийвыглядит#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>int msgctl(int msqid, int cmd, struct msgid_ds *buf)Данный вызов используется для получения или измененияпроцессом управляющих параметров, связанных с очередью иуничтожения очереди.

Ее аргументы — идентификатор ресурса,команда, которую необходимо выполнить, и структура,описывающая управляющие параметры очереди. Тип msgid_dsописан в заголовочном файле <sys/message.h>, и представляетсобой структуру, в полях которой хранятся права доступа к очереди,статистика обращений к очереди, ее размер и т.п.Возможные значения аргумента cmd:–скопироватьструктуру,описывающуюуправляющие параметры очереди по адресу, указанному в параметреIPC_STATbufIPC_SET – заменить структуру, описывающую управляющиепараметры очереди, на структуру, находящуюся по адресу,указанному в параметре bufIPC_RMID – удалить очередь. Как уже говорилось, удалитьочередь может только процесс, у которого эффективныйидентификатор пользователя совпадает с владельцем или создателемочереди, либо процесс с правами привилегированного пользователя.Пример 24. Использование очереди сообщений.Пример программы, где основной процесс читает некоторуютекстовую строку из стандартного ввода, и в случае, если строканачинается с буквы 'a', эта строка в качестве сообщения будетпередана процессу А, если 'b' - процессу В, если 'q' - то процессам Аи В, затем будет осуществлен выход.

Процессы А и Враспечатывают полученные строки на стандартный вывод.1066.2.4.1.1.1.1.1.1Основной процесс.#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <string.h>#include <unistd.h>#include <stdio.h>struct {long mtype;/* тип сообщения */char Data[256];/* сообщение */} Message;int main(int argc, char **argv){key_t key;int msgid;char str[256];key = ftok("/usr/mash",'s');/*получаемуникальныйключ,определяющий доступ к ресурсу */однозначноmsgid=msgget(key, 0666 | IPC_CREAT);/*создаем очередь сообщений , 0666 определяетправа доступа */for(;;) {/* запускаем вечный цикл */gets(str); /* читаем из стандартного вводастроку */strcpy(Message.Data, str);/* и копируем ее в буфер сообщения */switch(str[0]){case 'a':case 'A':Message.mtype = 1;/* устанавливаем тип */msgsnd(msgid, (struct msgbuf*)(&Message), strlen(str) + 1, 0);107/* посылаем сообщение в очередь*/break;case 'b':case 'B':Message.mtype = 2;msgsnd(msgid, (struct msgbuf*)(&Message), strlen(str) + 1, 0);break;case 'q':case 'Q':Message.mtype = 1;msgsnd(msgid, (struct msgbuf*)(&Message), strlen(str) + 1, 0);Message.mtype = 2;msgsnd(msgid, (struct msgbuf*)(&Message), strlen(str) + 1, 0);sleep(10);/*ждемполученияпроцессами А и В */сообщенийmsgctl(msgid, IPC_RMID, NULL);/* уничтожаем очередь*/return 0;default:break;}}}Процесс-приемник А/* процесс В аналогичен с точностью до четвертогопараметра в msgrcv */#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdio.h>108struct {long mtype;char Data[256];} Message;int main(int argc, char **argv){key_t key;int msgid;key = ftok("/usr/mash",'s');/* получаем ключ по тем же параметрам */msgid = msgget(key, 0666 | IPC_CREAT);/*подключаемся к очереди сообщений */for(;;) {/* запускаем вечный цикл */msgrcv(msgid, (struct msgbuf*) (&Message),256, 1, 0);/* читаем сообщение с типом 1*/if(Message.Data[0]=='q'Message.Data[0]=='Q') break;printf("\nПроцесс-приемникMessage.Data);А:||%s",}return 0;}Благодаря наличию типизации сообщений, очередь сообщенийпредоставляет возможность мультиплексировать сообщения отразличных процессов, при этом каждая пара взаимодействующихчерез очередь процессов может использовать свой тип сообщений, итаким образом, их данные не будут смешиваться.В качестве иллюстрации приведем следующий стандартныйпример взаимодействия.

Рассмотрим еще один пример - пустьсуществует процесс-сервер и несколько процессов-клиентов. Всеони могут обмениваться данными, используя одну очередьсообщений. Для этого сообщениям, направляемым от клиента ксерверу, присваиваем значение типа 1. При этом процесс,отправивший сообщение, в его теле передает некоторую109информацию, позволяющую его однозначно идентифицировать.Тогда сервер, отправляя сообщение конкретному процессу, вкачестве его типа указывает эту информацию (например, PIDпроцесса). Таким образом, сервер будет читать из очереди толькосообщения типа 1, а клиенты — сообщения с типами, равнымиидентификаторам их процессов.Пример 25. Очередь сообщений.

Модель «клиент-сервер»server#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <string.h>int main(int argc, char **argv){struct {long mestype;char mes [100];} messageto;struct {long mestype;long mes;} messagefrom;key_t key;int mesid;key = ftok("example",'r');mesid = msgget (key, 0666 | IPC_CREAT);while(1){if (msgrcv(mesid, &messagefrom,sizeof(messagefrom), 1, 0) <= 0) continue;messageto.mestype = messagefrom.mes;110strcpy( messageto.mes, "Message forclient");msgsnd (mesid, &messageto,sizeof(messageto), 0);}msgctl (mesid, IPC_RMID, 0);return 0;}client#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <unistd.h>#include <stdio.h>int main(int argc, char **argv){struct {long mestype;сообщения*//*описание структурыlong mes;} messageto;struct {long mestype;сообшения*//*описание структурыchar mes[100];} messagefrom;key_t key;int mesid;long pid = getpid();key = ftok("example", 'r');mesid = msgget(key, 0);очереди сообщений*/111/*присоединение кmessageto.mestype = 1;messageto.mes = pid;msgsnd (mesid, &messageto, sizeof(messageto),0); /* отправка */while ( msgrcv (mesid, &messagefrom,sizeof(messagefrom), pid, 0) <= 0);/*прием сообщения */printf("%s\n", messagefrom.mes);return 0;}6.3 Разделяемая памятьФизическая памятьВиртуальное адресноепр-во процессаВиртуальное адресноепр-во процессаРис.

19 Разделяемая памятьМеханизм разделяемой памяти позволяет несколькимпроцессам получить отображение некоторых страниц из своейвиртуальной памяти на общую область физической памяти.Благодаря этому, данные, находящиеся в этой области памяти, будутдоступны для чтения и модификации всем процессам,подключившимся к данной области памяти.Процесс, подключившийся к разделяемой памяти, может затемполучить указатель на некоторый адрес в своем виртуальномадресном пространстве, соответствующий данной областиразделяемой памяти. После этого он может работать с этой областью112памяти аналогично тому, как если бы она была выделенадинамически (например, путем обращения к malloc()), однако, какуже говорилось, сама по себе разделяемая область памяти неуничтожается автоматически даже после того, как процесс,создавший или использовавший ее, перестанет с ней работать.Рассмотримнабор системных вызовов для работы сразделяемой памятью.6.3.1 Создание общей памяти.#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>int shmget (key_t key, int size, int shmemflg)Аргументы этого вызова: key - ключ для доступа кразделяемой памяти; size задает размер области памяти, к которойпроцесс желает получить доступ.

Если в результате вызоваshmget() будет создана новая область разделяемой памяти, то ееразмер будет соответствовать значению size. Если же процессподключается к существующей области разделяемой памяти, тозначение size должно быть не более ее размера, иначе вызов вернет–1. Заметим, что если процесс при подключении к существующейобласти разделяемой памяти указал в аргументе size значение,меньшее ее фактического размера, то впоследствии он сможетполучить доступ только к первым size байтам этой области.Отметим, что в заголовочном файле <sys/shm.h> определеныконстанты SHMMIN и SHMMAX, задающий минимально возможный имаксимально возможный размер области разделяемой памяти.

Еслипроцесс пытается создать область разделяемой памяти, размеркоторой не удовлетворяет этим границам, системный вызовshmget() окончится неудачей.Третий параметр определяет флаги, управляющие поведениемвызова. Подробнее алгоритм создания/подключения разделяемогоресурса был описан выше.В случае успешного завершения вызов возвращаетположительное число – дескриптор области памяти, в случаенеудачи - -1.6.3.2 Доступ к разделяемой памяти.#include <sys/types.h>#include <sys/ipc.h>113#include <sys/shm.h>char *shmat(int shmid, char *shmaddr, int shmflg)При помощи этого вызова процесс подсоединяет областьразделяемой памяти, дескриптор которой указан в shmid, к своемувиртуальному адресному пространству. После выполнения этойоперации процесс сможет читать и модифицировать данные,находящиеся в области разделяемой памяти, адресуя ее как любуюдругую область в своем собственном виртуальном адресномпространстве.В качестве второго аргумента процесс может указатьвиртуальный адрес в своем адресном пространстве, начиная скоторого необходимо подсоединить разделяемую память.

Чащевсего, однако, в качестве значения этого аргумента передается 0, чтоозначает, что система сама может выбрать адрес начала разделяемойпамяти. Передача конкретного адреса в этом параметре имеет смыслв том случае, если, к примеру, в разделяемую память записываютсяуказатели на нее же (например, в ней хранится связанный список) –в этой ситуации для того, чтобы использование этих указателейимело смысл и было корректным для всех процессов, подключенныхк памяти, важно, чтобы во всех процессах адрес начала областиразделяемой памяти совпадал.Третий аргумент представляет собой комбинацию флагов. Вкачестве значения этого аргумента может быть указан флагSHM_RDONLY, который указывает на то, что подсоединяемая областьбудет использоваться только для чтения.Эта функция возвращает адрес, начиная с которого будетотображаться присоединяемая разделяемая память.

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

Список файлов книги

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