Параметры открытия путевых имен, спецификаторы объектов и атрибутов
Служба PPS поддерживает различные параметры путевых имен открываемых объектов. Эти параметры применяются к файловому дескриптору, который используется для доступа к объекту. Служба PPS также позволяет задавать действия над объектами и атрибутами (например, отключение записи объекта в постоянное хранилище или удаление атрибута) с помощью спецификаторов.
Содержание статьи:
Служба PPS поддерживает открытие объектов с использованием расширенного синтаксиса путевых имен
Параметры открытия добавляются в путевые имена в виде суффиксов и начинаются с символа вопросительного знака ("?"). Служба PPS применяет эти параметры к файловому дескриптору, который используется для доступа к объекту. Несколько параметров разделяются запятыми. Пример:
/pps/media/PlayList
— открыть файл PlayList
без использования параметров /pps/media/PlayList?wait
— открыть файл PlayList
c параметром wait /pps/media/Playlist?wait,delta
— открыть файл PlayList
с параметрами wait и delta /pps/media/.all?wait
— открыть каталог media
с параметром wait /pps/fish?notify=345:water
— открыть объект fish и связать его с группой уведомлений 345
![]() | Пользователи, которым знакома библиотечная функция getsubopt(), обнаружат близкое сходство ее параметров с параметрами открытия путевых имен службы PPS. |
Поддерживаются следующие параметры открытия путевых имен:
С помощью параметра critical можно удалять атрибуты издателя при его аварийном завершении.
Если этот параметр использован при открытии объекта для записи, то при закрытии файлового дескриптора служба PPS удаляет все атрибуты и префиксы, которые не записываются в постоянное хранилище, и добавляет префикс "*" к имени объекта во всех уведомлениях, отправляемых подписчикам. Служба PPS не публикует список удаленных атрибутов.
Каждый объект службы PPS должен иметь не более одного файлового дескриптора типа critical или server.
Настоятельно рекомендуется никогда не создавать несколько критических файловых дескрипторов для одного объекта PPS.
Можно дублировать файловые дескрипторы непосредственно (с помощью функций dup(), dup2(), fcntl(), и др.) или косвенно (с помощью функций fork(), spawn() и др). При дублировании дескрипторов увеличивается значение счетчика ссылок соответствующего критического дескриптора. Критические объекты отправляют уведомления и удаляют временные атрибуты только тогда, когда счетчик ссылок становится равным нулю (т.е. исходный файловый дескриптор и все его дубликаты закрыты).
Тем не менее, если объект службы PPS открывается в критическом режиме несколько раз, то каждый файловый дескриптор действует как критический: если его счетчик ссылок становится равным нулю, отправка уведомления и удаление атрибутов объекта выполняются даже при наличии других открытых файловых дескрипторов.
![]() | Не дублируйте серверные файловые дескрипторы, поскольку эффект от их использования не определен. |
Спецификаторы заключаются в квадратные скобки ("[qualifier]") и добавляются в качестве префиксов в строки, которые содержат имя соответствующего объекта или атрибута.
Чтобы задать спецификаторы вызова read() или write(), следует начать строку с именем объекта или атрибута с открывающей квадратной скобки, затем указать список спецификаторов, каждый из которых состоит из одной буквы или цифры, и завершить его закрывающей квадратной скобкой..
Поддерживаются следующие спецификаторы объектов и атрибутов:
Спецификаторы:
![]() |
|
Если перед спецификатором не указан какой-либо префикс, спецификатор установлен. Если перед спецификатором указан знак "-", спецификатор сброшен. Если спецификатор не задан, его состояние не изменяется. Пример:
Спецификатор непостоянного объекта/атрибута полезно присваивать атрибутам, которые не требуется сохранять, поскольку они становятся неактуальными после перезагрузки системы.
В следующей таблице описано влияние этого спецификатора на объекты и атрибуты службы PPS:
Синтаксис | Действие | Объект | Атрибут |
---|---|---|---|
n | Установка | Объект и его атрибуты становятся непостоянными; спецификаторы «постоянный», устанавливаемые для атрибутов объекта, игнорируются. | Атрибут становится непостоянным. |
-n | Сброс | Объект становится постоянным; постоянство его отдельных атрибутов зависит от их спецификаторов. | Атрибут становится постоянным, если его объект также является постоянным. |
При установке спецификатора «непостоянный» для объекта его атрибуты также становятся непостоянными; это позволяет легко создавать временный объект с непостоянным содержимым.
Дополнительную информацию см. в главе Сохранение данных в ПЗУ.
Спецификатор элемента применим только к атрибутам; он указывает службе PPS интерпретировать последующее значение как множество элементов. При формировании множества необходимо выбрать символ, который разделяет его элементы (например, запятую).
Разделитель:
Операции добавления и удаления применимы только к одному элементу. Пример добавления двух элементов в множество:
[i]items::hammer,[i]items::screw driver,
Пример удаления элемента из множества:
[-i]items::hammer,
Примеры некорректного синтаксиса элементов:
[i]items::hammer,screw driver,
или:
[-i]items::hammer,screw driver,
В следующих примерах разделителем является запятая (",").
Этот пример демонстрирует, что служба PPS игнорирует попытку повторного добавления элемента в множество. Если написать строки вида:
[i]items::hammer,[i]items::hammer,[i]items::screw driver,
выполнение операции чтения подписчиком приводит к следующему результату:
items::hammer,screw driver,
Этот пример демонстрирует поддержку нулевых элементов службой PPS. Если добавить следующую строку в множество, которое было создано в предыдущем примере:
[i]items::,
выполнение операции чтения подписчиком приводит к следующему результату:
items::hammer,screw driver,,
Этот пример демонстрирует удаление элемента из множества. Если добавить следующую строку в множество, которое было создано и обновлено в предыдущих примерах:
[-i]items::hammer,
выполнение операции чтения подписчиком приводит к следующему результату:
items::screw driver,,
Предыдущий раздел: Устойчивая служба публикации/подписки (PPS)