
- •Введение
- •1 Тема 7. Подсистема управления вводом-выводом
- •1.1 Язык С как стандарт взаимодействия с ОС
- •1.2 Системные операции для работы с файловой системой
- •1.2.1 Системные вызовы open() и close()
- •1.2.2 Системные вызовы read() и write()
- •1.2.3 Системный вызов lseek()
- •1.3 Создание специальных файлов
- •1.4 Запрос информации о статусе файлов
- •1.5 Каналы
- •1.5.1 Полудуплексные каналы UNIX
- •1.5.2 Именованные каналы FIFO
- •1.6 Дублирование дескрипторов файлов
- •1.7 Монтирование и демонтирование ФС
- •1.8 Ссылки на имена файлов
- •1.9 Лабораторная работа по теме №7
- •1.9.1 Интегрированная среда разработки Eclipse
- •1.9.2 Список заданий выполняемых работ
- •1.9.3 Проблема типов в языке С
- •1.9.4 Анализ структуры MBR блочных устройств
- •1.9.5 Запрос информации о статусе файлов
- •1.9.6 Неименованные каналы ядра ОС
- •1.9.7 Именованные каналы FIFO
- •1.9.8 Монтирование flashUSB
- •1.9.9 Работа с именами файлов
- •2 Тема 8. Подсистема управления памятью
- •2.1 Классификация способов управления ОЗУ
- •2.2 Программный и аппаратный способы адресации памяти
- •2.3 Страничная и сегментная адресации памяти
- •2.4 Комбинированный способ адресации памяти
- •2.5 Лабораторная работа по теме №8
- •2.5.1 Структура поцесса
- •2.5.2 Определяемые сегменты процесса
- •2.5.3 Создание и удаление процессов из памяти
- •2.5.4 Динамическое выделение и освобождение памяти процесса
- •3 Тема 9. Базовое взаимодействие процессов
- •3.1 Подсистема управления процессами
- •3.2 Синхронизация процессов
- •3.3 Стандарты POSIX
- •3.4 Системные вызовы ОС по управлению процессами
- •3.5 Системный вызов fork() и каналы процесса
- •1.5.1 Пример использования каналов процессов
- •1.5.2 Имитация конвейеров языка shell
- •3.6 Нити (Threads)
- •3.7 Сигналы POSIX
- •3.8 Лабораторная работа по теме №9
- •3.8.1 Системные вызовы общей группы
- •3.8.2 Управление потоками процессов
- •3.8.3 Обработка сигналов ОС
- •4 Тема 10. Асинхронное взаиодействие процессов
- •4.1 Проблемы распределения ресурсов ОС
- •4.2 Системный пакет IPC
- •4.3 Утилиты управления средствами пакета IPC
- •Утилита ipcmk
- •Утилита ipcs
- •Утлита ipcrm
- •4.4 Семафоры
- •4.5 Задача об обедающих философах
- •4.5.1 Описание задачи
- •4.5.2 Выбор стратегии решения
- •4.5.3 Модель философа
- •4.5.4 Программа-монитор
- •4.6 Лабораторная работа по теме №10
- •4.6.1 Синхронизация двух процессов
- •4.6.2 Задача «Обедающие философы»
- •5 Тема 11. Эффективное взаиодействие процессов
- •5.1 Прикладные средства пакета IPC
- •5.2 Разделяемые сегменты памяти
- •5.3 Задача о читателях и писателях
- •5.4 Передача сообщений
- •5.5 Лабораторная работа по теме №11
- •5.5.1 Задачи с разделяемыми сегментами памяти
- •5.5.2 Программы передачи сообщений
- •6 Тема 12. Системная шина D-Bus
- •6.1 Графические среды ОС
- •6.2 Рабочий стол пользователя
- •6.3 Различия графических сред ОС
- •6.4 X-сервер UNIX
- •6.5 Архитектура шины D-Bus
- •6.5.2 Бибиотека libdbus
- •6.5.3 Проекции ПО D-Bus на языки программирования
- •6.6 Лабораторная работа по теме №12
- •6.6.1 Утилита qdbus
- •6.6.2 Взаимодействие через шину с приложением evince
- •Заключение
- •Список использованных источников

208
/**
* Проверка наличия ПО D-Bus */
dbus_error_init(&error); /** * Соединение с шиной */
connection = dbus_bus_get(DBUS_BUS_SESSION, &error); if (!connection) {
printf("Ошибка соединения с D-BUS: %s\n", error.message); dbus_error_free(&error);
return 1;
}
/**
* Вызов метода Invoke() */
call = dbus_message_new_method_call("com.Skype.API", "/com/Skype", "com.Skype.API", "Invoke");
/**
* Передача методу Invoke() значения аргумента arg */
dbus_message_append_args (call, DBUS_TYPE_STRING, &arg, DBUS_TYPE_INVALID); /** * Ожидание ответа от шины */
reply = dbus_connection_send_with_reply_and_block (connection, call, 100000, &error); if (!reply) {
printf("Ошибка вызова метода: %s\n", error.message); dbus_error_free(&error);
return 1;
}
/** * Чтение ответа сообщения от шины */
dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &response, DBUS_TYPE_INVALID); if (response != NULL)
printf("Ответ: %s\n", response); /**
* Отключение использованных объектов от шины */
dbus_message_unref(call); dbus_message_unref(reply); dbus_connection_unref(connection); return 0;
}
Замечание
Объекты ПО D-Bus не следует рассматривать в терминах ООП, поскольку понятие класса здесь не используется. Тем не менее, все объекты имеют имена и доступны, при условии ограничений доступа из среды приложений ОС.
6.5.3 Проекции ПО D-Bus на языки программирования
Приведенный выше пример использует низкоуровневый доступ к D-Bus через библиотеку libdbus.
Для эффективного использования возможностей шины применяются проекции libdbus, реализованные на различные языки.
209 Широко известны следующие проекции:
•GLib API — библиотеки проекта GNU, которые можно найти по адресу: https://developer.gnome.org/gio/stable/gdbus-convenience.html;
•Python API — который широко используется во всех дистрибутивах Linux: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html;
•Qt API — которая составляет постоянную альтернативу библиотекам Glib API: http://doc.qt.io/qt-5/qtdbus-index.html.
Для доступа к шине D-Bus из языка shell используется набор утилит, которые следует внимательно изучить по руководству man:
dbus-cleanup- - используется для очистки директория от остатков сокетов; sockets
dbus-daemon - является демоном шины сообщений D-BUS;
dbus-launch - используется для запуска dbus-daemon из скрипта командной оболочки. Как правило, вызывается из скриптов, регистрирующих вход пользователей в систему;
dbus-monitor
dbus-send
dbus-uuidgen
libdbus-1.
{so,a}
-используется для мониторинга сообщений, поступающих через шину сообщений D-BUS;
-используется для отправки сообщения в шину сообщений D-BUS;
-используется для создания или чтения универсального уникального идентификатора;
-содержит функции API, используемые демоном сообщений D- BUS. D-BUS является первой библиотекой, в которой предложены средства обмена сообщениями вида 1:1 между двумя любыми приложениями; dbus-daemon является приложением, использую-
щим эту библиотеку для реализации демона шины сообщений;
qdbus |
- коммуникационный интерфейс для основанных на Qt API прило- |
|
жениях. |
В общем случае, для работы с D-Bus необходимо хорошо знать приложение, с которым осуществляется взаимодействие, или написать такое приложение самому.
Для практических целей, очень удобна утилита qdbus, например, запущенная без параметров, она выведет все доступные имена D-Bus, как показано на рисунке 6.8.