вторник, 12 апреля 2016 г.

Cache': Как спрятать данные от команды kill?

В работе с Cache на совсем низком уровне, как-то возникла задача что-то записывать и запоминать в локальных данных процесса, но таким образом, чтобы это не было видно обычным командам и в первую очередь команде kill. Интерес представляет что-то более масштабируемое чем чтение - запись переменной $DEVICE или установка блокировок и чтение ^$LOCK. На основе заметки о внутрисистемных $z функций О zobj командах и $zobj функциях нашлось решение. Можно создать объект простейшего класса, даже такого которые не создать штатными средствами, записать в него данные, увеличить счетчик ссылок, забыть ссылку на объект, и получить состояние в котором у процесса есть объект, есть записанные в него данные, но этот объект не виден никаким командам.

Итак, выполняем по порядку. Создаем простейший объект, типа данных (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'.

Комментариев нет:

Отправить комментарий