Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ ЧЕРЕЗ ИМЕНОВАННЫЕ КАНАЛЫ
Цель работы – знакомство с механизмом взаимодействия процессов через именованные каналы и изучение системных вызовов, обеспечивающих создание, открытие, запись, чтение, закрытие и удаление именованных каналов. Общие сведения Создание именованного канала производится вызовом: int mkfifo(const char *pathname, mode_t mode), где pathname – имя именованного канала; mode – права доступа к именованному каналу. Открытие именованного канала производится вызовом: int open(const char *pathname, int flags), где pathname – имя именованного канала; flags – флаги, задающие режим доступа к именованному каналу. Запись данных в именованный канал производится вызовом: ssize_t write(int fd, const void *buf, size_t count), где fd – дескриптор именованного канала; buf – буфер для записи данных; count – количество записанных данных. Чтение данных из именованного канала производится вызовом: ssize_t read(int fd, void *buf, size_t count), где fd – дескриптор именованного канала; buf – буфер для чтения данных; count – размер буфера. Закрытие именованного канала производится вызовом: int close(int fd), где fd – дескриптор именованного канала. Удаление именованного канала производится вызовом: int unlink(const char *pathname), где pathname – имя именованного канала. Указания к выполнению работы Написать комплект из двух программ, одна из которых записывает данные в именованный канал, а вторая – считывает эти данные. Проверить работу функций с блокировкой и без блокировки.
Шаблон программы 1 представлен ниже: объявить флаг завершения потока; объявить дескриптор именованного канала; Функция потока() { объявить буфер; Пока (флаг завершения потока не установлен) { сформировать сообщение в буфере; записать сообщение из буфера в именованный канал; задержать на время; } } Основная программа() { объявить идентификатор потока; создать именованный канал; открыть именованный канал для записи; создать поток из функции потока; ждать нажатия клавиши; установить флаг завершения потока; ждать завершения потока; закрыть именованный канал; удалить именованный канал; }
Шаблон программы 2 представлен ниже: объявить флаг завершения потока; объявить дескриптор именованного канала; Функция потока() { объявить буфер; Пока (флаг завершения потока не установлен) { очистить буфер сообщения; прочитать сообщение из именованного канала в буфер; вывести сообщение на экран; } } Основная программа() { объявить идентификатор потока; создать именованный канал; открыть именованный канал для чтения; создать поток из функции потока; ждать нажатия клавиши; установить флаг завершения потока; ждать завершения потока; закрыть именованный канал; удалить именованный канал; } Вопросы для самопроверки 1. Перечислите отличия именованного канала от неименованного канала. 2. Как осуществляется синхронизация чтения и записи в именованном канале? 3. Каким образом обеспечить открытие, закрытие, запись и чтение данных из именованного канала «без ожидания»? 4. Где ОС хранит данные, записываемые процессом в именованный канал? 5. Как создать именованный канал в терминальном режиме? 6. В чем отличие именованных каналов ОС семейства Linux от именованных каналов ОС семейства Windows? ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ ЧЕРЕЗ ОЧЕРЕДИ СООБЩЕНИЙ Цель работы -знакомство студентов с механизмом взаимодействия процессов – очередями сообщений и с системными вызовами, обеспечивающими создание, закрытие, удаление очередей сообщений, а также передачу и прием сообщений. Общие сведения Очередь сообщений – это средство, предоставляемое процессам для взаимодействия. Очереди сообщений содержат встроенный механизм синхронизации, обеспечивающий невозможность чтения сообщения из пустой очереди и записи сообщения в полную очередь. За счет того, что при создании и открытии очереди сообщений, ей передается «имя» - цепочка символов, два процесса получают возможность получить указатель на одну и ту же очередь сообщений. В системе очередь сообщений реализуется в виде специального файла, время жизни которого не ограничено временем жизни процесса, его создавшего. Существует несколько видов программных интерфейсов для создания очередей сообщений. В данном случае рассматривается программный интерфейс POSIX. Очередь сообщений создается следующим вызовом: mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr), где name – имя очереди сообщений; oflag - флаг, управляющий операцией создания очереди сообщений, при создании очереди сообщений необходимо указать флаг O_CREAT; mode – права доступа к очереди сообщений; attr – параметры очереди сообщений. Сообщение помещается в очередь следующим вызовом: int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio), где mqdes - идентификатор очереди сообщений; msg_ptr – указатель на сообщение; msg_len – длина сообщения; msg_prio – приоритет сообщения. Сообщение извлекается из очереди следующим вызовом: ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio), где mqdes - идентификатор очереди сообщений; msg_ptr – указатель на буфер для приема сообщения; msg_len – размер буфера; msg_prio – приоритет сообщения. Очередь сообщений закрывается следующим вызовом: int mq_close(mqd_t mqdes). Очередь сообщений удаляется следующим вызовом: int mq_unlink(const char *name). Указания к выполнению работы Написать комплект из двух программ, одна из которых передает сообщение в очередь сообщений, а вторая – принимает сообщения из очереди сообщений. Проверить работу функций с блокировкой и без блокировки.
Шаблон программы 1 представлен ниже: объявить флаг завершения потока; объявить идентификатор очереди сообщений; Функция потока() { объявить буфер; Пока (флаг завершения потока не установлен) { сформировать сообщение в буфере; записать сообщение из буфера в очередь сообщений; задержать на время; } } Основная программа() { объявить идентификатор потока; создать (или открыть, если существует) очередь сообщений; создать поток из функции потока; ждать нажатия клавиши; установить флаг завершения потока; ждать завершения потока; закрыть очередь сообщений; удалить очередь сообщений; }
Шаблон программы 2 представлен ниже: объявить флаг завершения потока; объявить идентификатор очереди сообщений; Функция потока() { объявить буфер; Пока (флаг завершения потока не установлен) { очистить буфер сообщения; принять сообщение из очереди сообщений в буфер; вывести сообщение на экран; } } Основная программа() { объявить идентификатор потока; создать (или открыть, если существует) очередь сообщений; создать поток из функции потока; ждать нажатия клавиши; установить флаг завершения потока; ждать завершения потока; закрыть очередь сообщений; удалить очередь сообщений; } Вопросы для самопроверки 1. Какие программные интерфейсы для работы с очередями сообщений существуют? 2. Дайте сравнительную характеристику программных интерфейсов очередей сообщений. 3. Каким образом обеспечить проверку наличия сообщений в очереди без блокирования процессов? 4. Каким образом обеспечить проверку наличия сообщений в очереди с определенной периодичностью? 5. Как осуществить передачу и прием оповещения от очереди о появлении нового сообщения в очереди? 6. Каким образом можно менять размер сообщений и количество сообщений в очереди? |
||
Последнее изменение этой страницы: 2018-04-12; просмотров: 558. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |