ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ ЧЕРЕЗ ИМЕНОВАННЫЕ КАНАЛЫ
Цель работы – знакомство с механизмом взаимодействия процессов через именованные каналы и изучение системных вызовов, обеспечивающих создание, открытие, запись, чтение, закрытие и удаление именованных каналов.
Общие сведения
Создание именованного канала производится вызовом:
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 представлен ниже:
объявить флаг завершения потока;
объявить идентификатор очереди сообщений;
Функция потока()
{
объявить буфер;
Дата добавления: 2018-04-05; просмотров: 1066; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!