Читаем Linux API. Исчерпывающее руководство полностью

pmsg/mq_notify_thread.c

Стоит отметить следующие архитектурные особенности программы из листинга 48.7.

• Программа запрашивает оповещения через поток, указав значение SIGEV_THREAD в поле sigev_notify структуры sigevent, которая передается в функцию mq_notify(). Начальная функция потока, threadFunc(), указана в поле sigev_notify_function .

• Включив оповещения, главная программа приостанавливается на неопределенное время; оповещения передаются по таймеру путем вызова в отдельном потоке функции threadFunc() .

• Дескриптор очереди сообщений, mqd, можно было бы сделать видимым для функции threadFunc(), создав для него глобальную переменную. Но, чтобы проиллюстрировать альтернативу, мы выбрали другой подход: адрес дескриптора очереди помещается в поле sigev_value.sival_ptr, которое передается вызову mq_notify() . Позже, при вызове функции hreadFunc(), данный адрес будет передан ей в качестве аргумента.

В поле sigev_value.sival_ptr следует хранить не сам дескриптор очереди сообщений (или его версию с приведенным типом), а указатель на него, так как данное значение не является массивом. Кроме того, стандарт SUSv3 не предусматривает никаких гарантий относительно происхождения или размера структуры данных, которая представляет тип mqd_t.

48.7. Возможности, характерные для Linux

Очереди POSIX-сообщений, реализованные в Linux, предоставляют ряд нестандартных, но полезных возможностей.

Отображение и удаление объектов очереди сообщений в командной строке

В главе 47 мы упоминали: объекты POSIX IPC реализованы в виде файлов, которые хранятся в виртуальной файловой системе, и их можно выводить и удалять с помощью команд ls и rm. Чтобы проделать это с очередями сообщений POSIX, нужно подключить соответствующую файловую систему, используя команду следующего вида:

# mount — t mqueue source target

Параметр source может быть каким угодно (обычно на его месте указывают строку none). Он ни на что не влияет, а всего лишь отображается командами mount и df, которые работают с файлом /proc/mounts. Параметр target — точка подключения файловой системы очереди сообщений. Процесс подключения файловой системы очереди сообщений и вывода ее содержимого показан в следующей сессии командной строки. Для начала создадим каталог и подключим к ней файловую систему:

$ su Для подключения требуются повышенные привилегии

Password:

# mkdir /dev/mqueue

# mount — t mqueue none /dev/mqueue

$ exit Завершаем сессию администратора

Теперь выведем запись файла /proc/mounts, которая касается нового подключения, а также права доступа к точке подключения:

$ cat /proc/mounts | grep mqueue

none /dev/mqueue mqueue rw 0 0

$ ls — ld /dev/mqueue

drwxrwxrwt 2 root root 40 Jul 26 12:09 /dev/mqueue

В выводе команды ls стоит обратить внимание на следующий аспект: при подключении файловой системы очереди сообщений выбранного каталога автоматически устанавливается закрепляющий бит (на это указывает буква t в поле с правами доступа). Это значит, что непривилегированный процесс может отключить только ту очередь, которой он владеет.

В завершение создадим очередь сообщений, выведем ее имя с помощью команды ls и удалим ее:

$ ./pmsg_create — c /newq

$ ls /dev/mqueue

newq

$ rm /dev/mqueue/newq

Получение сведений об очереди сообщений

Можно вывести содержимое объектов в файловой системе очереди сообщений. Каждый из таких объектов (виртуальных файлов) содержит информацию о соответствующей очереди:

$ ./pmsg_create — c /mq Создаем очередь

$ ./pmsg_send /mq abcdefg Записываем в очередь 7 байт

$ cat /dev/mqueue/mq

QSIZE:7 NOTIFY:0 SIGNO:0 NOTIFY_PID:0

Поле QSIZE обозначает общее количество байтов данных в очереди. Оставшиеся поля относятся к оповещениям. Если значение NOTIFY_PID не равно 0, то процесс с указанным идентификатором подписался на оповещения для этой очереди; сведения о типе оповещений хранятся в следующих полях:

• NOTIFY — значение, связанное с одной из констант sigev_notify: 0 (SIGEV_SIGNAL), 1 (SIGEV_NONE) или 2 (SIGEV_THREAD);

• при выборе типа оповещения SIGEV_SIGNAL поле SIGNO определяет, какой именно сигнал будет доставлен.

Информация, хранящаяся в этих полях, проиллюстрирована в следующей сессии командной строки:

$ ./mq_notify_sig /mq & Оповещение с помощью сигнала SIGUSR1

(номер 10 на платформе x86)

$ cat /dev/mqueue/mq

QSIZE:7 NOTIFY:0 SIGNO:10 NOTIFY_PID:18158

$ kill %1

[1] Terminated./mq_notify_sig /mq

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных