191
Листринг 5.6 - Текст программы, которая читает сообщения из очереди
/** Программа lab11.6, иллюстрирующая чтение из очереди сообщений.
*
*она получает доступ к очереди сообщений и читает из
*нее сообщения с любым типом в порядке FIFO до тех пор, пока не
*получит сообщение с типом 255, которое будет служить сигналом
*прекращения работы. */
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> #include <stdio.h> #include <stdlib.h>
/* Тип сообщения для прекращения работы программы lab11.6 */ #define LAST_MESSAGE 255
int main()
{
int msqid; /* IPC дескриптор для очереди сообщений */ /** Имя файла, использующееся для генерации ключа.
* Файл с таким именем должен существовать */ char pathname[] = "/home/upk/lab11";
key_t key; /* IPC ключ */
int len, maxlen; /* Длина информативной части сообщения max длина */
/* Пользовательская структура для сообщения */ struct mymsgbuf
{
long mtype; char mtext[81];
} mybuf;
printf("lab11.6: Начинаю работу...\n"); /** Генерируем IPC ключ из имени файла
*и номера экземпляра очереди сообщений 0. */ if((key = ftok(pathname,0)) < 0){
perror("Не могу сгенерировать key\n"); exit(-1);
}
/** Получаем доступ по ключу к очереди сообщений,
*если она существует, или создать ее, с правами доступа
*read & write для всех пользователей */
if((msqid = msgget(key, 0666 | IPC_CREAT)) < 0){ perror("Не могу получить msqid\n"); exit(-1);
}
/** В бесконечном цикле принимаем сообщения любого типа
*в порядке FIFO с максимальной длиной информативной части
*81 символ до тех пор, пока не поступит сообщение с типом LAST_MESSAGE*/ while(1){
maxlen = 81;
if(( len = msgrcv(msqid, (struct msgbuf *) &mybuf, maxlen, 0, 0)) < 0) { printf("Не могу получить сообщение из очереди\n");
exit(-1);
}
/* Если принятое сообщение имеет тип LAST_MESSAGE, прекращаем работу и удаляем очередь сообщений из системы. В противном случае печатаем текст принятого сообщения. */
192
if (mybuf.mtype == LAST_MESSAGE){
msgctl(msqid, IPC_RMID, (struct msqid_ds *) NULL); perror("lab11.6: Закончил работу...\n");
exit(0);
}
printf("Тип сообщения = %ld, сообщение = %s\n", mybuf.mtype, mybuf.mtext);
}
/* Исключительно для отсутствия предупреждений при компиляции. */
return 0;
}
На рисунке 5.2 показан вывод этой программы.
Рисунок 5.2 — Вывод программы читающей сообщения
Замечание
Программы работы с очередями сообщений имеют только внутренние средства синхронизации, связанные с целостностью операций записи в очередь и чтения из нее. Очевидно, что многие задачи могут потребовать дополнительных средств для синхронизации их критических областей.
В таком случае, следует дополнительно воспользоваться инструментом семафоров.
193
Данная лабораторная работа опирается на теоретический материал первой части данного методического пособия. Она посвящена вопросам практического использования разделяемых сегментов памяти и передачи сообщений.
Поскольку, разделяемые сегменты памяти являются разделяемыми ресурсами, то для них становится актуальной задачи синхронизации, которые разделяют между процессами одновременный доступ к критическим областям программ.
С другой стороны, технология передачи сообщений имеет свои внутренние средства синхронизации, поэтому применение ее значительно проще.
Учитывая эти обстоятельства, лабораторная работа разделена на две части:
•первая часть посвящена примерам использования разделяемых сегментов
памяти в двух вариантах: с учетом необходимости синхронизации доступа к ним и без необходимости такого учета;
•вторая часть предлагает выполнение примера передачи сообщений между двумя не синхронизированными задачами.
Замечание
Главная практическая цель, которую должен усвоить студент выполняющий лабораторную работу №11 — эффективность применения средств пакета IPC по сравнению с базовыми средствами управления процессами, изученными в теме №9.
Учебный материал данного подраздела предполагает, что студент успешно освоил часть технологии пакета IPC, изложенной в теме №10.
Задание 5.1
Изучить теоретический материал, изложенный в подразделах 5.1 и 5.2 данного методического пособия.
Всреде разработки Eclipse: создать проект с именем lab11.1, набрать и отладить программу по тексту листинга 5.1.
Всреде разработки Eclipse: создать проект с именем lab11.2, набрать и отладить программу по тексту листинга 5.2.
Скопировать исполняемые файлы проектов в директорию ~/bin. Запуская программы lab11.1 и lab11.2, изучить их работу. Отразить содержание проделанной работы в личном отчете.
194
Задание 5.2
Изучить теоретический материал, изложенный в подразделе 5.3 данного методического пособия.
Всреде разработки Eclipse: создать проект с именем lab11.3, набрать и отладить программу-читателей по тексту листинга 5.3.
Всреде разработки Eclipse: создать проект с именем lab11.4, набрать и отладить программу-писателя по тексту листинга 5.4.
Скопировать исполняемый файл программы-читателей в директорию ~/bin. Запуская программу-читателя lab11.3 из терминала, а программу-писателя lab11.2 из среды разработки Eclipse, - изучить их работу.
Отразить содержание проделанной работы в личном отчете.
Задание 5.3
Изучить теоретический материал, изложенный в подразделе 5.4 данного методического пособия.
Всреде разработки Eclipse: создать проект с именем lab11.5, набрать и отладить программу-читателей по тексту листинга 5.5.
Всреде разработки Eclipse: создать проект с именем lab11.6, набрать и отладить программу-писателя по тексту листинга 5.6.
Запуская программу lab11.5, передающую набор сообщений, а также программу lab11.6, читающую сообщения, - изучить их работу.
Отразить содержание проделанной работы в личном отчете.
Замечание
Программы проектов lab11.5 и lab11.6 можно, по очереди, запускать из среды разработки Eclipse или скопировать их исполняемые файлы проектов в директорию ~/bin.
195
Рассмотренные в предыдущих темах средства пакета IPC являются достаточно эффективными для большинства системных приложений, в которых требуется
сложная логика и имеется опасность блокировок.
С развитием сложности и многоплановости асинхронно взаимодейтсвующих приложений стали возникать проблемы, вызванные следующими двумя причинами:
•возрастание логической сложности программных систем требует сложной
алгоритмической реализации управляющих подсистем, что снижает их качество при использовании низкоуровневых средств программирования, которым является IPC;
•снижаются темпы разработки и отладки больших программных систем.
Примером таких приложений является графическая подсистема ОС.
Проблематика равития графических подсистем ОС, которые построены на основе множества асинхронно взаимодействующих процессов, потребовало создания специальных высококровневых средств синхронизации процессов, вызванное все возрастающими требования к интерактивным системам.
Чтобы разобраться в этой проблематике, в подразделах 6.1 - 6.4 рассматриваются различные аспекты использования X Window System, являющейся до настоящего времени основой графических подсистем UNIX-подобных ОС.
Конкретизацию решения указанной проблематики рассмотрим на примере шины D-Bus, которая является современным подходом, обеспечивающим высокоуровневое асинхронное взаимодействие процессов.
D-Bus - система межпроцессного взаимодействия, которая позволяет приложениям в операционной системе общаться друг с другом.
D-Bus является частью проекта freedesktop.org, обладает высокой скоростью работы и не зависит от рабочей среды ОС.
D-Bus работает на POSIX-совместимых ОС и имеет вариант реализации для MS Windows.
D-Bus состоит из двух частей:
•демона, реализующего саму шину;
•низкоуровневого API, на основе библиотеки libdbus;
•существуют также высокоуровневые библиотеки для фреймворков: Qt, Java, Glib, C#, Python, Ruby и библиотека для C++.
Указанный круг вопросов составляет содержание теоретической части данного пособия.