В работе с Cache на совсем низком уровне, как-то возникла задача что-то
записывать и запоминать в локальных данных процесса, но таким образом, чтобы
это не было видно обычным командам и в первую очередь команде kill. Интерес представляет что-то более
масштабируемое чем чтение - запись переменной $DEVICE или установка блокировок и чтение ^$LOCK.
На основе заметки о внутрисистемных $z функций
О zobj командах и $zobj функциях
нашлось решение. Можно создать объект простейшего класса, даже такого которые не создать штатными средствами,
записать в него данные, увеличить счетчик ссылок, забыть ссылку на объект, и получить состояние в котором у процесса
есть объект, есть записанные в него данные, но этот объект не виден никаким командам.
Итак, выполняем по порядку. Создаем простейший объект, типа данных (Datatype):
Итак, выполняем по порядку. Создаем простейший объект, типа данных (Datatype):
USER>s oref=$zobjnew("%String")Проверяем что объект есть:
USER>w oref=<OBJECT REFERENCE>[1@%Library.String]Записываем в объект данные, в дефолтное первое свойство, первый свободный слот для пропертей:
USER>s $zobjval(oref,1)="This is data string."Проверяем что данные записаны:
USER>w $zobjval(oref,1) This is data string.Перед удалением объекта добавляем ему счетчик ссылок, чтобы при удалении собственно удаления объекта не произошло, а удалился лишь oref ссылающийся на объект:
USER>w $zobjincref(oref) 1Удаляем локальную переменную oref:
USER>k orefПроверяем что в локальных переменных процесса ничего не видно:
USER>w USER>Зная номер объекта, это первая часть его oref до символа @, получаем ссылку на объект в локальную переменную:
USER>s oref=$zobjref(1)Проверяем, что в локальных переменных есть переменная удерживающая ссылку на объект:
USER>w oref=<OBJECT REFERENCE>[1@%Library.String]Читаем записанные данные:
USER>w $zobjval(oref,1) This is data string.Уменьшаем дополнительный счетчик фиксаций ссылок на объект, чтобы он удалился при удалении последней ссылки:
USER>w $zobjdecref(oref) 0Удаляем
USER>kПроверяем, что по номеру объекта получить ссылку на него уже не получится и он удален на самом деле:
USER>w $zobjref(1) W $ZOBJREF(1) ^ <INVALID OREF>Таким образом, в целом задача сокрытия данных от команд как kill так и write без аргументов частично, по меньшей мере, решаема. Неудобство в том, что приведенные zobj команды и $zobj функции как-бы не очень документированы, чтобы на них можно было рассчитывать во всех будущих версиях Cache'.
Комментариев нет:
Отправить комментарий