Главная » Просмотр файлов » Н.В. Вдовикина, И.В. Машечкин, А.Н. Терехин, В.В. Тюляева - Программирование в ОС UNIX на языке Си

Н.В. Вдовикина, И.В. Машечкин, А.Н. Терехин, В.В. Тюляева - Программирование в ОС UNIX на языке Си (1114934), страница 13

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

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

Однако, еслиодин из этих процессов повторно вызовет «get»-метод с ключомIPC_PRIVATE, в результате будет получен другой, совершенно новыйразделяемый ресурс, так как при обращении к «get»-методу с ключом IPC_PRIVATE всякий раз создается новый объект нужноготипа16.Если при обращении к «get»-методу указан ключ, отличныйот IPC_PRIVATE, происходит следующее:• Происходит поиск объекта с заданным ключом среди ужесуществующих объектов нужного типа. Если объект с указанным ключом не найден, и среди флагов указан флагIPC_CREAT, будет создан новый объект. При этом значениепараметра флагов должно содержать побитовое сложениефлага IPC_CREAT и константы, указывающей права доступадля вновь создаваемого объекта.• Если объект с заданным ключом не найден, и среди переданных флагов отсутствует флаг IPC_CREAT, «get»-методвернет –1, а в переменной errno будет установлено значение ENOENT• Если объект с заданным ключом уже существует, «get»метод вернет дескриптор для этого существующего объекта.Если такая ситуация нежелательна (т.е.

означает случайнуюколлизию имен), следует указать в параметре флагов нарядус флагом IPC_CREAT и правами доступа еще и флагIPC_EXCL – в этом случае «get»-метод вернет -1, если объект с таким ключом уже существует (переменная errno будет установлена в значение EEXIST)• при подключении к уже существующему объекту дополнительно проверяются права доступа к нему. В случае, еслипроцесс, запросивший доступ к объекту, не имеет на тогарантируется, что функция ftok() ни при каких значениях своих входных параметров не может сгенерировать ключ, совпадающий с IPC_PRIVATE.1682прав, «get»-метод вернет –1, а в переменной errno будетустановлено значение EACCESSДля каждого типа объектов IPC существует некое ограничениена максимально возможное количество одновременно существующих в системе объектов данного типа.

Если при попытке созданиянового объекта указанное ограничение будет превышено, «get»метод, совершавший попытку создания объекта, вернет -1, а в переменной errno будет указано значение ENOSPC.Даже если ни один процесс не подключен к разделяемому ресурсу, система не удаляет его автоматически. Удаление объектовIPC является обязанностью одного из работающих с ним процессови для этого системой предоставляются соответствующие функциипо управлению объектами System V IPC.Очередь сообщенийОчередь сообщений представляет собой некое хранилище типизированных сообщений, организованное по принципу FIFO.

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

Извлечение сообщений из очереди происходит согласно принципу FIFO – впорядке их записи, однако процесс-получатель может указать, из какой подочереди он хочет извлечь сообщение, или, иначе говоря, сообщение какого типа он желает получить – в этом случае из очередибудет извлечено самое «старое» сообщение нужного типа (см. Рис.2).ВААВАВАРис.2 Типизированные очереди сообщенийРассмотрим набор системных вызовов, поддерживающий работу с очередями сообщений.Доступ к очереди сообщенийДля создания новой или для доступа к существующей очередииспользуется системный вызов int msgget (key_t key, int83msgflag).

В случае успеха вызов возвращает положительный деск-риптор очереди, который может в дальнейшем использоваться дляопераций с ней, в случае неудачи -1. Первым аргументом вызова является ключ, вторым – флаги, управляющие поведением вызова.Подробнее детали процесса создания/подключения к ресурсу описаны выше.Отправка сообщенияДля отправки сообщения используется функция int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg).Ее первый аргумент — идентификатор очереди, полученный в результате вызова msgget().

Второй аргумент — указатель на буфер,содержащий реальные данные (тело сообщения) и тип сообщения,подлежащего посылке в очередь, в третьем аргументе указываетсядлина тела сообщения в байтах.Буфер интерпретируется как структура, соответствующая следующему шаблону:#include <sys/msg.h>struct msgbuf {long msgtype; // тип сообщенияchar msgtext[1]; //данные (тело сообщения)};В реальности такая структура не означает, что телом сообщения обязательно должен быть лишь один символ (и вообще текст,состоящий из символов). Приложение может определить собственную структуру для сообщения, содержащую в качестве тела любыеполя необходимой длины – важно лишь, чтобы первым полем всегдавыступало целое типа long, соответствующее типу сообщения. Остальные данные в этой структуре системой никак не интерпретируются и передаются в качестве тела сообщения «как есть».В заголовочном файле <sys/msg.h> определена константаMSGMAX, описывающая максимальный размер тела сообщения.

Припопытке отправить сообщение, у которого число элементов в массиве msgtext превышает это значение, системный вызов вернет –1.Четвертый аргумент данного вызова может принимать значения 0 или IPC_NOWAIT. В случае отсутствия флага IPC_NOWAIT вызывающий процесс будет блокирован (т.е. приостановит работу), еслидля посылки сообщения недостаточно системных ресурсов, т.е. еслиполная длина сообщений в очереди будет больше максимально допустимого. Если же флаг IPC_NOWAIT будет установлен, то в такойситуации выход из вызова произойдет немедленно, и возвращаемоезначение будет равно –1.В случае удачной записи возвращаемое значение вызова равно0.84Получение сообщения.Для получения сообщения имеется функция int msgrcv (intmsqid, void *msgp, size_t msgsz, long msgtyp, intmsgflg).

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

В любом случае, как уже говорилось, из подочереди с заданным типом (или из общей очереди,если тип не задан) будет выбрано самое старое сообщение.Последним аргументом является комбинация (побитовое сложение) флагов. Если среди флагов не указан IPC_NOWAIT, и в очереди не найдено ни одного сообщения, удовлетворяющего критериямвыбора, процесс будет заблокирован до появления такого сообщения. Однако, если такое сообщение существует, но его длина превышает указанную в аргументе msgsz, то процесс заблокирован небудет, и вызов сразу вернет –1.

Сообщение при этом останется вочереди. Если же флаг IPC_NOWAIT указан, то вызов сразу вернет –1.Процесс может также указать флаг MSG_NOERROR – в этом случае он может прочитать сообщение, даже если его длина превышаетуказанную емкость буфера. В этом случае в буфер будет записанопервые msgsz байт из тела сообщения, а остальные данные отбрасываются.В случае удачного чтения возвращаемое значение вызова равно фактической длине тела полученного сообщения в байтах.Управление очередью сообщенийДля управления очередью сообщений используется функцияint msgctl(int msqid, int cmd, struct msgid_ds *buf).Данный вызов служит для получения или изменения процессом управляющих параметров, связанных с очередью и уничтоженияочереди.

Его аргументы — идентификатор ресурса, команда, которую необходимо выполнить, и структура, описывающая управляющие параметры очереди. Тип msgid_ds описан в заголовочном файле <sys/message.h>, и представляет собой структуру, в полях кото-85рой хранятся права доступа к очереди, статистика обращений к очереди, ее размер и т.п.Возможные значения аргумента cmd:IPC_STAT – скопировать структуру, описывающую управляющие параметры очереди по адресу, указанному в параметре buf;IPC_SET – заменить структуру, описывающую управляющиепараметры очереди, на структуру, находящуюся по адресу, указанному в параметре buf;IPC_RMID – удалить очередь. Как уже говорилось, удалитьочередь может только процесс, у которого эффективный идентификатор пользователя совпадает с владельцем или создателем очереди,либо процесс с правами привилегированного пользователя.Задача 1. Написать программу: основной процесс читает некоторую текстовую строку из стандартного ввода, и в случае, еслистрока начинается с буквы 'a', эта строка в качестве сообщения будет передана первому потомку, если 'b' - второму потомку, а по получении строки 'q' будет осуществлен выход.

Процессы-потомкираспечатывают полученные строки на стандартный вывод.Основной#include#include#include#include#include#includeпроцесс.<sys/types.h><sys/ipc.h><sys/msg.h><string.h><unistd.h><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);86/* и копируем ее в буфер сообщения */switch(str[0]){case 'a':case 'A':Message.mtype = 1;/* устанавливаем тип */msgsnd(msgid, (struct msgbuf*)(&Message), strlen(str) + 1, 0);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#include#include#include<sys/types.h><sys/ipc.h><sys/msg.h><stdio.h>struct {long mtype;char Data[256];} Message;int main(int argc, char **argv){key_t key; int msgid;87key = ftok("/usr/mash",'s');/* получаем ключ по тем же параметрам */msgid = msgget(key, 0666 | IPC_CREAT);/*подключаемся к очереди сообщений */for(;;) {msgrcv(msgid, (struct msgbuf*) (&Message),256, 1, 0);if (Message.Data[0]=='q' ||Message.Data[0]=='Q') break;printf("\nПроцесс-приемник А: %s",Message.Data);}return 0;}Разделяемая памятьМеханизм разделяемой памяти позволяет нескольким процессам получить отображение некоторых страниц из своей виртуальнойпамяти на общую область физической памяти.

Благодаря этому,данные, находящиеся в этой области памяти, будут доступны длячтения и модификации всем процессам, подключившимся к даннойобласти памяти.Процесс, подключившийся к разделяемой памяти, может затемполучить указатель на некоторый адрес в своем виртуальном адресном пространстве, соответствующий данной области разделяемойпамяти. После этого он может работать с этой областью памяти аналогично тому, как если бы она была выделена динамически (например, путем обращения к malloc()), однако, как уже говорилось, сама по себе разделяемая область памяти не уничтожается автоматически даже после того, как процесс, создавший или использовавшийее, перестанет с ней работатьСоздание общей памятиДля создания объекта разделяемой памяти служит вызов intshmget (key_t key, int size, int shmemflg).Аргументы этого вызова: key - ключ для доступа к разделяемой памяти; size задает размер области памяти, к которой процессжелает получить доступ.

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

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

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