Операционная система ЗОСРВ «Нейтрино» > Руководство разработчика > Интерфейсы различных подсистем > Устойчивая служба публикации/подписки (PPS) > Общие сведения > Параметры и спецификаторы



Параметры и спецификаторы

Параметры открытия путевых имен, спецификаторы объектов и атрибутов

Служба PPS поддерживает различные параметры путевых имен открываемых объектов. Эти параметры применяются к файловому дескриптору, который используется для доступа к объекту. Служба PPS также позволяет задавать действия над объектами и атрибутами (например, отключение записи объекта в постоянное хранилище или удаление атрибута) с помощью спецификаторов.

Содержание статьи:

Параметры открытия путевых имен
Параметр critical
Дублирование критических файловых дескрипторов
Критические файловые дескрипторы
Серверные файловые дескрипторы
Спецификаторы объектов и атрибутов
Задание спецификаторов
Спецификатор непостоянного объекта/атрибута
Спецификатор элемента
Добавление и удаление элементов множества
Некорректный синтаксис элемента
Примеры
Пример 1: Дублирование элементов
Пример 2: Нулевые элементы
Пример 3: Удаление элемента

Параметры открытия путевых имен

Служба PPS поддерживает открытие объектов с использованием расширенного синтаксиса путевых имен

Параметры открытия добавляются в путевые имена в виде суффиксов и начинаются с символа вопросительного знака ("?"). Служба PPS применяет эти параметры к файловому дескриптору, который используется для доступа к объекту. Несколько параметров разделяются запятыми. Пример:


Note: Пользователи, которым знакома библиотечная функция getsubopt(), обнаружат близкое сходство ее параметров с параметрами открытия путевых имен службы PPS.

Поддерживаются следующие параметры открытия путевых имен:

critical
Указывает, что издатель является критическим для объекта. См. раздел "Параметр critical" ниже.
delta
Открывает объект в дельта-режиме. См. раздел Подписка на несколько объектов.
deltadir
Возвращает имена всех объектов (файлов) каталога и применяется только к специальному объекту .all, который находится в нем. При создании и удалении объектов каталога перед их именами указывается префикс "+" (создание) или "-" (удаление). Это позволяет с легкостью использовать функцию readdir() в службе PPS и отслеживать изменения в файловой системе, не отслеживая изменения атрибутов. См. раздел Подписка на несколько объектов.
f=attr+attr+...
Фильтрует уведомления в соответствии со списком имен атрибутов. Атрибуты отделяются друг от друга знаками "+". В полном режиме файловый дескриптор получает уведомления только при изменении одного из указанных атрибутов. В этом случае объект возвращается полностью. В дельта-режиме опрашиваются только перечисленные атрибуты, а изменения других атрибутов игнорируются.
nopersist
Отключает запись объекта в постоянное хранилище. При перезапуске системы объект уничтожается. По умолчанию все объекты записываются в постоянное хранилище и загружаются после перезапуска. Подробнее см. раздел "Спецификаторы объектов и атрибутов" ниже.
notify=id:value
Включает дескриптор открытого файла в группу с указанным идентификатором, который возвращается первой операцией чтения файла .notify, находящегося в корневом каталоге точки монтирования службы PPS. Операция чтения файла .notify возвращает строку "id:value", когда в файле, дескриптор которого был открыт с параметром __notify=__, появляются доступные данные. См. раздел Подписка на несколько объектов.
server
Указывает, что издатель является «сервером» объекта. Дополнительную информацию см. в разделе Серверные объекты.
wait
Открывает файл со сброшенным флагом O_NONBLOCK; последующие вызовы read() ожидают изменения объекта. Дополнительную информацию см. в главе Подписка.

Параметр critical

С помощью параметра critical можно удалять атрибуты издателя при его аварийном завершении.

Если этот параметр использован при открытии объекта для записи, то при закрытии файлового дескриптора служба PPS удаляет все атрибуты и префиксы, которые не записываются в постоянное хранилище, и добавляет префикс "*" к имени объекта во всех уведомлениях, отправляемых подписчикам. Служба PPS не публикует список удаленных атрибутов.

Дублирование критических файловых дескрипторов

Каждый объект службы PPS должен иметь не более одного файлового дескриптора типа critical или server.

Критические файловые дескрипторы

Настоятельно рекомендуется никогда не создавать несколько критических файловых дескрипторов для одного объекта PPS.

Можно дублировать файловые дескрипторы непосредственно (с помощью функций dup(), dup2(), fcntl(), и др.) или косвенно (с помощью функций fork(), spawn() и др). При дублировании дескрипторов увеличивается значение счетчика ссылок соответствующего критического дескриптора. Критические объекты отправляют уведомления и удаляют временные атрибуты только тогда, когда счетчик ссылок становится равным нулю (т.е. исходный файловый дескриптор и все его дубликаты закрыты).

Тем не менее, если объект службы PPS открывается в критическом режиме несколько раз, то каждый файловый дескриптор действует как критический: если его счетчик ссылок становится равным нулю, отправка уведомления и удаление атрибутов объекта выполняются даже при наличии других открытых файловых дескрипторов.

Серверные файловые дескрипторы


Caution: Не дублируйте серверные файловые дескрипторы, поскольку эффект от их использования не определен.

Спецификаторы объектов и атрибутов

Спецификаторы заключаются в квадратные скобки ("[qualifier]") и добавляются в качестве префиксов в строки, которые содержат имя соответствующего объекта или атрибута.

Чтобы задать спецификаторы вызова read() или write(), следует начать строку с именем объекта или атрибута с открывающей квадратной скобки, затем указать список спецификаторов, каждый из которых состоит из одной буквы или цифры, и завершить его закрывающей квадратной скобкой..

Поддерживаются следующие спецификаторы объектов и атрибутов:

n
Непостоянный объект/атрибут (см. "Спецификатор непостоянного объекта/атрибута" ниже).

Спецификаторы:

i
Элемент (см. "Спецификатор элемента" ниже).


Note:
  • По умолчанию все спецификаторы «сброшены».
  • При вызове функции read() выводится только список спецификаторов заданных параметров ("[option letters]").
  • Параметры атрибутов всегда предшествуют специальному символу и имени объекта или атрибута.

Задание спецификаторов

Если перед спецификатором не указан какой-либо префикс, спецификатор установлен. Если перед спецификатором указан знак "-", спецификатор сброшен. Если спецификатор не задан, его состояние не изменяется. Пример:

Спецификатор непостоянного объекта/атрибута

Спецификатор непостоянного объекта/атрибута полезно присваивать атрибутам, которые не требуется сохранять, поскольку они становятся неактуальными после перезагрузки системы.

В следующей таблице описано влияние этого спецификатора на объекты и атрибуты службы PPS:

Синтаксис Действие Объект Атрибут
n Установка Объект и его атрибуты становятся непостоянными; спецификаторы «постоянный», устанавливаемые для атрибутов объекта, игнорируются. Атрибут становится непостоянным.
-n Сброс Объект становится постоянным; постоянство его отдельных атрибутов зависит от их спецификаторов. Атрибут становится постоянным, если его объект также является постоянным.

При установке спецификатора «непостоянный» для объекта его атрибуты также становятся непостоянными; это позволяет легко создавать временный объект с непостоянным содержимым.

Дополнительную информацию см. в главе Сохранение данных в ПЗУ.

Спецификатор элемента

Спецификатор элемента применим только к атрибутам; он указывает службе PPS интерпретировать последующее значение как множество элементов. При формировании множества необходимо выбрать символ, который разделяет его элементы (например, запятую).

Разделитель:

Добавление и удаление элементов множества

Операции добавления и удаления применимы только к одному элементу. Пример добавления двух элементов в множество:

[i]items::hammer,
[i]items::screw driver,

Пример удаления элемента из множества:

[-i]items::hammer,

Некорректный синтаксис элемента

Примеры некорректного синтаксиса элементов:

[i]items::hammer,screw driver,

или:

[-i]items::hammer,screw driver,

Примеры

В следующих примерах разделителем является запятая (",").

Пример 1: Дублирование элементов

Этот пример демонстрирует, что служба PPS игнорирует попытку повторного добавления элемента в множество. Если написать строки вида:

[i]items::hammer,
[i]items::hammer,
[i]items::screw driver,

выполнение операции чтения подписчиком приводит к следующему результату:

items::hammer,screw driver,

Пример 2: Нулевые элементы

Этот пример демонстрирует поддержку нулевых элементов службой PPS. Если добавить следующую строку в множество, которое было создано в предыдущем примере:

[i]items::,

выполнение операции чтения подписчиком приводит к следующему результату:

items::hammer,screw driver,,

Пример 3: Удаление элемента

Этот пример демонстрирует удаление элемента из множества. Если добавить следующую строку в множество, которое было создано и обновлено в предыдущих примерах:

[-i]items::hammer,

выполнение операции чтения подписчиком приводит к следующему результату:

items::screw driver,,




Предыдущий раздел: Устойчивая служба публикации/подписки (PPS)