Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ ЧЕРЕЗ ИМЕНОВАННЫЕ КАНАЛЫ




Цель работы – знакомство с механизмом взаимодействия процессов через именованные каналы и изучение системных вызовов, обеспечивающих создание, открытие, запись, чтение, закрытие и удаление именованных каналов.

Общие сведения

Создание именованного канала производится вызовом:

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; просмотров: 554.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...