Spec-Zone.ru › Tcl/Tk

interp

ИМЯ
interp — Создавать и управлять интерпретаторами Tcl
СИНТАКСИС
ОПИСАНИЕ
КОМАНДА INTERP
interp alias srcPath srcToken
interp alias srcPath srcToken {}
interp alias srcPath srcCmd targetPath targetCmd ?arg arg ...?
interp aliases ?path?
interp bgerror path ?cmdPrefix?
interp cancel ?-unwind? ?--? ?path? ?result?
interp create ?-safe? ?--? ?path?
interp debug path ?-frame ?bool??
interp delete ?path ...?
interp eval path arg ?arg ...?
interp exists path
interp expose path hiddenName ?exposedCmdName?
interp hide path exposedCmdName ?hiddenCmdName?
interp hidden path
interp invokehidden path ?-option ...? hiddenCmdName ?arg ...?
interp issafe ?path?
interp limit path limitType ?-option? ?value ...?
interp marktrusted path
interp recursionlimit path ?newlimit?
interp share srcPath channelId destPath
interp slaves ?path?
interp target path alias
interp transfer srcPath channelId destPath
КОМАНДА СЛУГИ
slave aliases
slave alias srcToken
slave alias srcToken {}
slave alias srcCmd targetCmd ?arg ..?
slave bgerror ?cmdPrefix?
slave eval arg ?arg ..?
slave expose hiddenName ?exposedCmdName?
slave hide exposedCmdName ?hiddenCmdName?
slave hidden
slave invokehidden ?-option ...? hiddenName ?arg ..?
slave issafe
slave limit limitType ?-option? ?value ...?
slave marktrusted
slave recursionlimit ?newlimit?
БЕЗОПАСНЫЕ ИНТЕРПРЕТАТОРЫ
ВЫЗОВ АЛИАСА
СКРЫТЫЕ КОМАНДЫ
ОГРАНИЧЕНИЯ РЕСУРСОВ
ВАРИАНТЫ ОГРАНИЧЕНИЙ
-command
-granularity
-milliseconds
-seconds
-value
ОБРАБОТКА ИСКЛЮЧЕНИЙ В ФОНЕ
АВТОРЫ
ПРИМЕРЫ
СМОТРИТЕ ТАКЖЕ
КЛЮЧЕВЫЕ СЛОВА

Имя

interp — Создавать и управлять интерпретаторами Tcl

Синтаксис

interp подкоманда ?арг арг ...?

Описание

Эта команда позволяет создать один или несколько новых интерпретаторов Tcl, которые существуют вместе с создающим интерпретатором в одном приложении. Создающий интерпретатор называется мастером, а новый интерпретатор — слугой. Мастер может создать любое количество слуг, и каждый слуга может сам создать дополнительных слуг, для которых он является мастером, что приводит к иерархии интерпретаторов.

Каждый интерпретатор независим от других: у него есть свое собственное пространство имен для команд, процедур и глобальных переменных. Мастер-интерпретатор может создавать соединения между своими слугами и самим собой с помощью механизма, называемого алиасом. Алиас — это команда в интерпретаторе слуги, которая при вызове вызывает команду в его мастер-интерпретаторе или в другом слуге-интерпретаторе. Единственные другие соединения между интерпретаторами — через переменные окружения (переменная env), которые обычно разделяются всеми интерпретаторами в приложении, и по событиям превышения лимитов ресурсов. Обратите внимание, что пространство имен для файлов (таких как имена, возвращаемые командой open) больше не разделяются между интерпретаторами. Предоставляются явные команды для совместного использования файлов и передачи ссылок на открытые файлы от одного интерпретатора к другому.

Команда interp также поддерживает безопасные интерпретаторы. Безопасный интерпретатор — это слуга, функции которого сильно ограничены, так что можно безопасно выполнять недоверенные скрипты, не опасаясь, что они повредят другие интерпретаторы или среду приложения. Например, все команды создания каналов ввода-вывода и создания дочерних процессов недоступны для безопасных интерпретаторов. См. БЕЗОПАСНЫЕ ИНТЕРПРЕТАТОРЫ ниже, чтобы узнать больше об имеющихся функциях в безопасном интерпретаторе. Опасная функциональность не удаляется из безопасного интерпретатора; вместо этого она скрыта, так что доступ к ней могут получить только доверенные интерпретаторы. Подробное объяснение скрытых команд см. в разделе СКРЫТЫЕ КОМАНДЫ ниже. Механизм алиасов может использоваться для защищенного обмена данными (аналогично вызову ядра) между слугой-интерпретатором и его мастером. Подробности работы механизма алиасов см. в разделе ВЫЗОВ АЛИАСА ниже.

Квалифицированное имя интерпретатора — это правильный список Tcl, содержащий подмножество его предков в иерархии интерпретаторов, завершающийся строкой, обозначающей интерпретатор в его непосредственном подчиненном интерпретаторе. Имена интерпретаторов относительны к интерпретатору, в котором они используются. Например, если «a» является слугой текущего интерпретатора и у него есть слуга «a1», который в свою очередь имеет слугу «a11», квалифицированное имя «a11» в «a» — это список «a1 a11».

Команда interp, описанная ниже, принимает квалифицированные имена интерпретаторов в качестве аргументов; интерпретатор, в котором оценивается команда, всегда может быть обозначен как {} (пустой список или строка). Обратите внимание, что невозможно сослаться на мастер-интерпретатор (предок) по имени в слуге-интерпретаторе, кроме как через алиасы. Также нет глобального имени, по которому можно сослаться на первый созданный интерпретатор в приложении. Оба ограничения обусловлены соображениями безопасности.

Команда interp

Команда interp используется для создания, удаления и управления слугами-интерпретаторами, а также для совместного использования или передачи каналов между интерпретаторами. Она может иметь несколько форм, в зависимости от аргумента подкоманда:
interp alias srcPath srcToken
Возвращает список Tcl, элементами которого являются targetCmd и args, связанные с псевдонимом, представленным srcToken (это значение, возвращаемое при создании псевдонима; возможно, что имя исходной команды в подчиненном интерпретаторе отличается от srcToken).
interp alias srcPath srcToken {}
Удаляет псевдоним для srcToken в подчиненном интерпретаторе, идентифицированном srcPath. srcToken ссылается на значение, возвращаемое при создании псевдонима; если исходная команда была переименована, будет удалена переименованная команда.
interp alias srcPath srcCmd targetPath targetCmd ?arg arg ...?
Эта команда создает псевдоним между одним подчиненным интерпретатором и другим (см. команду alias подчиненного интерпретатора ниже для создания псевдонимов между подчиненным интерпретатором и его основным интерпретатором). В этой команде любой из подчиненных интерпретаторов может находиться в любой части иерархии интерпретаторов под интерпретатором, вызывающим команду. SrcPath и srcCmd идентифицируют источник псевдонима. SrcPath — это список Tcl, элементы которого выбирают конкретный интерпретатор. Например, «a b» идентифицирует интерпретатор «b», который является подчиненным интерпретатором «a», который, в свою очередь, является подчиненным интерпретатором вызывающего интерпретатора. Пустой список указывает на вызывающий интерпретатор. srcCmd указывает имя новой команды, которая будет создана в исходном интерпретаторе. TargetPath и targetCmd указывают целевой интерпретатор и команду, а аргументы arg, если таковые имеются, указывают дополнительные аргументы для targetCmd, которые добавляются к любым аргументам, указанным в вызове srcCmd. TargetCmd может быть неопределена во время этого вызова, или она может уже существовать; она не создается этой командой. Псевдоним обеспечивает вызов данной целевой команды в целевом интерпретаторе всякий раз, когда данная исходная команда вызывается в исходном интерпретаторе. См. ВЫЗОВ ПСЕВДОНИМА ниже для получения более подробной информации. Команда возвращает маркер, который однозначно идентифицирует созданную команду srcCmd, даже если команда будет переименована позже. Маркер может, но не обязательно, быть равен srcCmd.
interp aliases ?path?
Эта команда возвращает список Tcl маркеров всех исходных команд для псевдонимов, определенных в интерпретаторе, идентифицированном path. Маркеры соответствуют значениям, возвращаемым при создании псевдонимов (которые могут не совпадать с текущими именами команд).
interp bgerror path ?cmdPrefix?
Эта команда либо получает, либо устанавливает текущий обработчик исключений в фоновом режиме для интерпретатора, идентифицированного path. Если cmdPrefix отсутствует, возвращается текущий обработчик исключений в фоновом режиме, а если он присутствует, то это список слов (минимальной длины один), который описывает, на что следует установить обработчик исключений в фоновом режиме интерпретатора. См. раздел ОБРАБОТКА ИСКЛЮЧЕНИЙ В ФОНОВОМ РЕЖИМЕ для получения более подробной информации.
interp cancel ?-unwind? ?--? ?path? ?result?
Отменяет выполнение скрипта в интерпретаторе, идентифицированном path. Без ключа -unwind стек вычислений для интерпретатора разворачивается до тех пор, пока не будет найдена окружающая команда catch или пока не останется больше вызовов интерпретатора в стеке вызовов. С ключом -unwind стек вычислений для интерпретатора разворачивается без учета любых промежуточных команд catch до тех пор, пока не останется больше вызовов интерпретатора в стеке вызовов. Ключ -- может использоваться для обозначения конца ключей; он может потребоваться, если path имеет необычное значение, например -safe. Если result присутствует, он будет использоваться в качестве строки сообщения об ошибке; в противном случае будет использоваться строка сообщения об ошибке по умолчанию.
interp create ?-safe? ?--? ?path?
Создает подчиненный интерпретатор, идентифицированный path, и новую команду, называемую командой подчиненного интерпретатора. Имя команды подчиненного интерпретатора — это последний компонент path. Новый подчиненный интерпретатор и команда подчиненного интерпретатора создаются в интерпретаторе, идентифицированном путем удаления последнего компонента из path. Например, если path — это a b c, то новый подчиненный интерпретатор и команда подчиненного интерпретатора с именем c создаются в интерпретаторе, идентифицированном путем a b. Команда подчиненного интерпретатора может использоваться для управления новым интерпретатором, как описано ниже. Если path опущен, Tcl создает уникальное имя в форме interpx, где x — целое число, и использует его для интерпретатора и команды подчиненного интерпретатора. Если указан ключ -safe (или если основной интерпретатор является безопасным интерпретатором), новый подчиненный интерпретатор будет создан как безопасный интерпретатор с ограниченной функциональностью; в противном случае подчиненный интерпретатор будет включать полный набор встроенных команд и переменных Tcl. Ключ -- может использоваться для обозначения конца ключей; он может потребоваться, если path имеет необычное значение, например -safe. Результатом команды является имя нового интерпретатора. Имя подчиненного интерпретатора должно быть уникальным среди всех подчиненных интерпретаторов для его основного интерпретатора; возникает ошибка, если подчиненный интерпретатор с данным именем уже существует в этом основном интерпретаторе. Начальный предел рекурсии подчиненного интерпретатора устанавливается в текущий предел рекурсии его родительского интерпретатора.
interp debug path ?-frame ?bool??
Управляет тем, будет ли информация о стеке на уровне фрейма захватываться в подчиненном интерпретаторе, идентифицированном path. Если аргументы не указаны, возвращается параметр и текущее значение. Если указан -frame, то настройка отладки устанавливается в указанное логическое значение, если оно предоставлено, и возвращается текущее значение. Это влияет только на вывод info frame, поскольку точная информация о стеке на уровне фрейма для вызова команд на уровне байткода захватывается только при включенной настройке.

Например, с кодом, подобным

proc mycontrol {... script} {
  ...
  uplevel 1 $script
  ...
}

proc dosomething {...} {
  ...
  mycontrol {
    somecode
  }
}

стандартная настройка будет предоставлять относительный номер строки для команды somecode, а соответствующий фрейм будет иметь тип eval. С другой стороны, при активной отладке фреймов отслеживание распространяется настолько далеко, что система сможет определить файл и абсолютный номер строки этой команды и вернуть фрейм типа source. Эта более точная информация достигается за счет более медленного выполнения всех команд.

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

interp delete ?path ...?
Удаляет ноль или более интерпретаторов, заданных необязательными аргументами path, а для каждого интерпретатора также удаляет его подчиненные интерпретаторы. Команда также удаляет команду подчиненного интерпретатора для каждого удаленного интерпретатора. Для каждого аргумента path, если интерпретатор с таким именем не существует, команда вызывает ошибку.
interp eval path arg ?arg ...?
Эта команда объединяет все аргументы arg таким же образом, как команда concat, а затем выполняет полученную строку как скрипт Tcl в подчиненном интерпретаторе, идентифицированном path. Результат этого выполнения (включая все параметры return, такие как информация -errorinfo и -errorcode, если возникает ошибка) возвращается вызывающему интерпретатору. Обратите внимание, что скрипт будет выполнен в текущем контекстном фрейме стека интерпретатора path; это сделано для того, чтобы реализации (в основном интерпретаторе) псевдонимов в подчиненном интерпретаторе могли выполнять скрипты в подчиненном интерпретаторе, которые получают информацию о текущем состоянии и фрейме стека подчиненного интерпретатора.
interp exists path
Возвращает 1, если подчиненный интерпретатор по указанному path существует в этом основном интерпретаторе, 0 в противном случае. Если path опущен, используется вызывающий интерпретатор.
interp expose path hiddenName ?exposedCmdName?
Делает скрытую команду hiddenName видимой, в конечном итоге возвращая ее под новым именем exposedCmdName (это имя в настоящее время принимается только в том случае, если это допустимое имя глобального пространства имен без ::), в интерпретаторе, обозначенном path. Если видимая команда с целевым именем уже существует, эта команда завершается неудачей. Скрытые команды более подробно объясняются в разделе СКРЫТЫЕ КОМАНДЫ ниже.
interp hide path exposedCmdName ?hiddenCmdName?
Делает видимую команду exposedCmdName скрытой, переименовывая ее в скрытую команду hiddenCmdName или сохраняя то же имя, если hiddenCmdName не указано, в интерпретаторе, обозначенном path. Если скрытая команда с целевым именем уже существует, эта команда завершается неудачей. В настоящее время ни exposedCmdName, ни hiddenCmdName не могут содержать квалификаторы пространств имен, иначе возникает ошибка. Команды, которые должны быть скрыты с помощью interp hide, ищутся в глобальном пространстве имен, даже если текущее пространство имен не является глобальным. Это предотвращает обман подчиненных интерпретаторов основного интерпретатора, заставляя скрывать неправильную команду, делая текущее пространство имен отличным от глобального. Скрытые команды более подробно объясняются в разделе СКРЫТЫЕ КОМАНДЫ ниже.
interp hidden path
Возвращает список имен всех скрытых команд в интерпретаторе, идентифицированном path.
interp invokehidden path ?-option ...? hiddenCmdName ?arg ...?
Вызывает скрытую команду hiddenCmdName с предоставленными аргументами в интерпретаторе, обозначенном path. К аргументам не применяются подстановки или вычисления. Поддерживаются три параметра -option, все из которых начинаются с -: -namespace (который принимает один аргумент после, nsName), -global и --. Если присутствует флаг -namespace, скрытая команда вызывается в пространстве имен, называемом nsName, в целевом интерпретаторе. Если присутствует флаг -global, скрытая команда вызывается на глобальном уровне в целевом интерпретаторе; в противном случае она вызывается в текущем фрейме вызова и может получать доступ к локальным переменным в этом и внешних фреймах вызова. Флаг -- позволяет аргументу hiddenCmdName начинаться с символа «-» и в остальном не нужен. Если присутствуют как флаги -namespace, так и -global, флаг -namespace игнорируется. Обратите внимание, что скрытая команда будет выполняться (по умолчанию) в текущем контекстном фрейме стека интерпретатора path. Скрытые команды более подробно объясняются в разделе СКРЫТЫЕ КОМАНДЫ ниже.
interp issafe ?path?
Возвращает 1, если интерпретатор, идентифицированный указанным path, является безопасным, 0 в противном случае.
interp limit path limitType ?-option? ?value ...?
Настраивает, изменяет и запрашивает конфигурацию ограничения ресурсов limitType для интерпретатора, обозначенного path. Если не указан параметр -option, возвращается текущая конфигурация ограничения. Если -option является единственным аргументом, возвращается значение этого параметра. В противном случае должен быть предоставлен список пар аргументов -option/value. Более подробное объяснение поддерживаемых ограничений и параметров см. в разделе ОГРАНИЧЕНИЯ РЕСУРСОВ ниже.
interp marktrusted path
Помечает интерпретатор, идентифицированный по path, как надёжный. Скрытые команды не отображаются. Эту команду можно вызвать только из надёжного интерпретатора. Команда не имеет эффекта, если интерпретатор, идентифицированный по path, уже надёжный.
interp recursionlimit path ?newlimit?
Возвращает максимальную разрешённую глубину вложенности для интерпретатора, указанного по path. Если указан newlimit, ограничение вложенности интерпретатора будет установлено таким образом, чтобы вложенность более чем newlimit вызовов Tcl_Eval и связанных процедур в этом интерпретаторе вернула ошибку. Значение newlimit также возвращается. Значение newlimit должно быть положительным целым числом от 1 до максимального значения не-длинного целого числа на платформе.

Команда устанавливает только максимальный размер стека вызовов Tcl. Она сама по себе не может предотвратить переполнение стека на C-стеке, используемом приложением. Если ваш компьютер имеет ограничение на размер C-стека, вы можете получить переполнение стека, прежде чем достигнете ограничения, установленного командой. Если это произойдёт, проверьте, есть ли в вашей системе механизм для увеличения максимального размера C-стека.

interp share srcPath channelId destPath
Приводит к тому, что канал ввода-вывода, идентифицируемый по channelId, становится общим между интерпретатором, идентифицированным по srcPath, и интерпретатором, идентифицированным по destPath. Оба интерпретатора имеют одинаковые права на канале ввода-вывода. Оба интерпретатора должны закрыть его, чтобы закрыть подлежащий канал ввода-вывода; каналы ввода-вывода, доступные в интерпретаторе, автоматически закрываются при уничтожении интерпретатора.
interp slaves ?path?
Возвращает список Tcl имён всех подчиненных интерпретаторов, связанных с интерпретатором, идентифицированным по path. Если path опущен, используется вызывающий интерпретатор.
interp target path alias
Возвращает список Tcl, описывающий целевой интерпретатор для псевдонима. Псевдоним задаётся с помощью пути интерпретатора и имени командного источника, так же как в команде interp alias выше. Имя целевого интерпретатора возвращается как путь интерпретатора, относительно вызывающего интерпретатора. Если целевой интерпретатор для псевдонима - это вызывающий интерпретатор, возвращается пустой список. Если целевой интерпретатор для псевдонима не является вызывающим интерпретатором или одним из его потомков, генерируется ошибка. Целевая команда не должна быть определена на момент вызова.
interp transfer srcPath channelId destPath
Приводит к тому, что канал ввода-вывода, идентифицируемый по channelId, становится доступным в интерпретаторе, идентифицированном по destPath, и недоступным в интерпретаторе, идентифицированном по srcPath.

Команда подчиненного интерпретатора

Для каждого подчиненного интерпретатора, созданного с помощью команды interp, в мастер-интерпретаторе создаётся новая команда Tcl с тем же именем, что и новый интерпретатор. Эта команда может использоваться для вызова различных операций над интерпретатором. Она имеет следующий общий вид:
slave command ?arg arg ...?

Slave - это имя интерпретатора, а command и args определяют точное поведение команды. Допустимые формы этой команды:

slave aliases
Возвращает список Tcl, элементы которого являются токенами всех псевдонимов в slave. Токены соответствуют значениям, возвращённым при создании псевдонимов (которые могут не совпадать с текущими именами команд).
slave alias srcToken
Возвращает список Tcl, элементы которого - targetCmd и args, связанные с псевдонимом, представленным srcToken (это значение, возвращённое при создании псевдонима; возможно, что фактическая исходная команда в подчиненном интерпретаторе отличается от srcToken).
slave alias srcToken {}
Удаляет псевдоним для srcToken в подчиненном интерпретаторе. srcToken относится к значению, возвращённому при создании псевдонима; если исходная команда была переименована, будет удалена переименованная команда.
slave alias srcCmd targetCmd ?arg ..?
Создаёт псевдоним, такой, что при вызове srcCmd в slave вызывается targetCmd в мастер-интерпретаторе. Аргументы arg передаются в targetCmd как дополнительные аргументы, предваряя любые аргументы, переданные при вызове srcCmd. Подробности см. в разделе ВЫЗОВ ПСЕВДОНИМА ниже. Команда возвращает токен, уникально идентифицирующий созданную команду srcCmd, даже если команда позже переименована. Токен может, но не обязательно, быть равен srcCmd.
slave bgerror ?cmdPrefix?
Эта команда либо получает, либо устанавливает текущий обработчик исключений в фоновом режиме для интерпретатора slave. Если cmdPrefix отсутствует, возвращается текущий обработчик исключений в фоновом режиме, а если присутствует, это список слов (минимум одно), описывающий, что следует установить для обработчика исключений в фоновом режиме интерпретатора. Подробнее см. раздел ОБРАБОТКА ИСКЛЮЧЕНИЙ В ФОНОМ РЕЖИМЕ.
slave eval arg ?arg ..?
Эта команда конкатенирует все аргументы arg таким же образом, как команда concat, затем вычисляет получившуюся строку как сценарий Tcl в slave. Результат этого вычисления (включая все опции return, такие как информация -errorinfo и -errorcode, если произошла ошибка) возвращается вызывающему интерпретатору. Обратите внимание, что сценарий будет выполняться в текущей области стека вызовов slave; это необходимо для того, чтобы реализации (в мастер-интерпретаторе) псевдонимов в подчиненном интерпретаторе могли выполнять скрипты в подчиненном интерпретаторе, узнавая информацию о текущем состоянии и области стека вызовов подчиненного интерпретатора.
slave expose hiddenName ?exposedCmdName?
Эта команда раскрывает скрытую команду hiddenName, потенциально переименовав её в exposedCmdName (это имя в настоящее время принимается только в том случае, если это допустимое имя глобального пространства имён без ::), в slave. Если экспонированная команда с целевым именем уже существует, эта команда завершается неудачно. Подробнее о скрытых командах см. в разделе СКРЫТЫЕ КОМАНДЫ ниже.
slave hide exposedCmdName ?hiddenCmdName?
Эта команда скрывает экспонированную команду exposedCmdName, переименовывая её в скрытую команду hiddenCmdName, или сохраняя то же имя, если аргумент не указан, в интерпретаторе slave. Если скрытая команда с целевым именем уже существует, эта команда завершается неудачно. В настоящее время и exposedCmdName, и hiddenCmdName не могут содержать квалификаторы пространства имён, в противном случае возникает ошибка. Команды, подлежащие скрытию, ищутся в глобальном пространстве имён, даже если текущее пространство имён не является глобальным. Это предотвращает подчиненным интерпретаторам вводить в заблуждение мастер-интерпретатор, скрывая неверную команду, делая текущее пространство имён отличным от глобального. Подробнее о скрытых командах см. в разделе СКРЫТЫЕ КОМАНДЫ ниже.
slave hidden
Возвращает список имён всех скрытых команд в slave.
slave invokehidden ?-option ...? hiddenName ?arg ..?
Эта команда вызывает скрытую команду hiddenName с предоставленными аргументами в slave. К аргументам не применяются подстановки или вычисления. Поддерживаются три параметра -option, все начинающиеся с -: -namespace (принимающий один аргумент после него, nsName), -global и --. Если задан флаг -namespace, скрытая команда вызывается в указанном пространстве имён в slave. Если задан флаг -global, команда вызывается на глобальном уровне в slave; в противном случае она вызывается в текущей области стека вызовов и может получить доступ к локальным переменным в этой или внешних областях стека вызовов. Флаг -- позволяет аргументу hiddenCmdName начинаться с символа “-”, и в противном случае он не нужен. Если заданы оба флага -namespace и -global, флаг -namespace игнорируется. Обратите внимание, что скрытая команда будет выполняться (по умолчанию) в текущей области стека вызовов slave. Подробнее о скрытых командах см. в разделе СКРЫТЫЕ КОМАНДЫ ниже.
slave issafe
Возвращает 1, если подчиненный интерпретатор надёжный, 0 в противном случае.
slave limit limitType ?-option? ?value ...?
Настраивает, изменяет и запрашивает конфигурацию ограничения ресурсов limitType для подчиненного интерпретатора. Если не указан -option, возвращается текущая конфигурация ограничения. Если -option является единственным аргументом, возвращается значение этого параметра. В противном случае должен быть предоставлен список пар аргументов -option/value. Более подробное объяснение поддерживаемых ограничений и параметров см. в разделе ОГРАНИЧЕНИЯ РЕСУРСОВ ниже.
slave marktrusted
Помечает подчиненный интерпретатор как надёжный. Может вызываться только надёжным интерпретатором. Эта команда не раскрывает скрытые команды в подчиненном интерпретаторе. Команда не имеет эффекта, если подчиненный интерпретатор уже надёжный.
slave recursionlimit ?newlimit?
Возвращает максимальную разрешённую глубину вложенности для интерпретатора slave. Если указан newlimit, ограничение вложенности в slave будет установлено таким образом, чтобы вложенность более чем newlimit вызовов Tcl_Eval() и связанных процедур в slave вернула ошибку. Значение newlimit также возвращается. Значение newlimit должно быть положительным целым числом от 1 до максимального значения не-длинного целого числа на платформе.

Команда устанавливает только максимальный размер стека вызовов Tcl. Она сама по себе не может предотвратить переполнение стека на C-стеке, используемом приложением. Если ваш компьютер имеет ограничение на размер C-стека, вы можете получить переполнение стека, прежде чем достигнете ограничения, установленного командой. Если это произойдёт, проверьте, есть ли в вашей системе механизм для увеличения максимального размера C-стека.

Надёжные интерпретаторы

Безопасный интерпретатор — это интерпретатор с ограниченными функциями, поэтому безопасно выполнить произвольный скрипт от вашего худшего врага без опасений, что этот скрипт повредит приложение или остальную часть вашей вычислительной среды. Чтобы сделать интерпретатор безопасным, из него удаляются определенные команды и переменные. Например, команды для создания файлов на диске удаляются, а команда exec удаляется, поскольку она может использоваться для причинения вреда через подпроцессы. Ограниченный доступ к этим функциям может быть предоставлен путем создания псевдонимов к мастер-интерпретатору, которые тщательно проверяют свои аргументы и предоставляют ограниченный доступ к безопасной подмножеству функций. Например, создание файлов может быть разрешено в определённом подкаталоге, а вызов подпроцессов может быть разрешён для тщательно отобранного и фиксированного набора программ.

Безопасный интерпретатор создаётся путём указания переключателя -safe для команды interp create. Кроме того, любой раб, созданный безопасным интерпретатором, также будет безопасным.

Безопасный интерпретатор создаётся с точно таким набором встроенных команд:

after

append

apply

array

binary

break

catch

chan

clock

close

concat

continue

dict

eof

error

eval

expr

fblocked

fcopy

fileevent

flush

for

foreach

format

gets

global

if

incr

info

interp

join

lappend

lassign

lindex

linsert

list

llength

lrange

lrepeat

lreplace

lsearch

lset

lsort

namespace

package

pid

proc

puts

read

regexp

regsub

rename

return

scan

seek

set

split

string

subst

switch

tell

time

trace

unset

update

uplevel

upvar

variable

vwait

while

Следующие команды скрыты командой interp create при создании безопасного интерпретатора:

cd

encoding

exec

exit

fconfigure

file

glob

load

open

pwd

socket

source

unload

Эти команды могут быть воссозданы позже как Tcl-процедуры или псевдонимы, или повторно экспонированы с помощью interp expose.

Следующие команды из библиотеки вспомогательных процедур Tcl отсутствуют в безопасном интерпретаторе:

auto_exec_ok

auto_import

auto_load

auto_load_index

auto_qualify

unknown

Обратите внимание, что у безопасных интерпретаторов нет команды unknown по умолчанию, поэтому стандартные возможности автоматической загрузки Tcl недоступны. Автоматический доступ к командам Tcl, которые обычно загружаются автоматически:

auto_mkindex

auto_mkindex_old

auto_reset

history

parray

pkg_mkIndex

::pkg::create

::safe::interpAddToAccessPath

::safe::interpCreate

::safe::interpConfigure

::safe::interpDelete

::safe::interpFindInAccessPath

::safe::interpInit

::safe::setLogCmd

tcl_endOfWord

tcl_findLibrary

tcl_startOfNextWord

tcl_startOfPreviousWord

tcl_wordBreakAfter

tcl_wordBreakBefore

могут быть обеспечены только явным определением команды unknown в безопасном интерпретаторе. Это потребует экспонирования команды source. Это проще всего сделать, создав безопасный интерпретатор с помощью механизма Safe-Tcl Tcl. Safe-Tcl предоставляет безопасные версии source, load и других Tcl-команд, необходимых для поддержки автоматической загрузки команд и загрузки пакетов.

Кроме того, переменная env отсутствует в безопасном интерпретаторе, поэтому она не может обмениваться переменными окружения с другими интерпретаторами. Переменная env представляет собой угрозу безопасности, поскольку пользователи могут хранить конфиденциальную информацию в переменной среды. Например, руководство PGP рекомендует хранить пароль защиты закрытого ключа PGP в переменной среды PGPPASS. Предоставление этой переменной недоверенному коду, выполняющемуся в безопасном интерпретаторе, создаст угрозу безопасности.

Если в безопасный интерпретатор загружаются расширения, они также могут ограничивать свои собственные функции, чтобы устранить небезопасные команды. Подробнее о управлении расширениями для обеспечения безопасности см. в справочных материалах для Safe-Tcl и команды Tcl load.

Безопасный интерпретатор не может изменять предел рекурсии ни одного интерпретатора, включая себя.

Вызов псевдонима

Механизм псевдонимов тщательно разработан таким образом, чтобы его можно было безопасно использовать, когда недоверенный скрипт выполняется в безопасном рабочем интерпретаторе, а целевой псевдоним — в доверенном мастер-интерпретаторе. Самое важное для обеспечения безопасности — убедиться, что информация, передаваемая от раба к мастеру, никогда не оценивается и не подставляется в мастер; в противном случае злой скрипт на рабочем интерпретаторе может вызвать произвольные функции в мастер-интерпретаторе, что компрометирует безопасность.

При вызове источника псевдонима в подчиненном интерпретаторе выполняются обычные подстановки Tcl при разборе этой команды. Эти подстановки производятся в интерпретаторе источника так же, как и для любой другой команды, вызываемой в этом интерпретаторе. Процедура команды для команды источника принимает её аргументы и объединяет их с targetCmd и arg для псевдонима, создавая новый массив аргументов. Если слова srcCmd были «srcCmd arg1 arg2 ... argN», новый набор слов будет «targetCmd arg arg ... arg arg1 arg2 ... argN», где targetCmd и arg являются значениями, заданными при создании псевдонима. Затем TargetCmd используется для поиска процедуры команды в целевом интерпретаторе, и эта процедура команды вызывается с новым набором аргументов. Возникает ошибка, если в целевом интерпретаторе нет команды с именем targetCmd. Дополнительные подстановки не выполняются со словами: процедура целевой команды вызывается непосредственно, без прохождения обычного механизма оценки Tcl. Таким образом, подстановки выполняются для каждого слова ровно один раз: targetCmd и args были подставлены при разборе команды, создавшей псевдоним, а arg1 - argN подставляются при разборе исходной команды псевдонима в интерпретаторе источника.

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

Скрытые команды

Безопасные интерпретаторы значительно ограничивают функциональность, доступную для программ Tcl, выполняемых в них. Разрешение недоверенной программе Tcl иметь прямой доступ к этой функциональности небезопасно, поскольку она может быть использована для различных атак на среду. Однако иногда есть законная необходимость использования опасной функциональности в контексте безопасного интерпретатора. Например, иногда программу необходимо загрузить в интерпретатор. Другой пример — Tk, где окна привязаны к иерархии окон для конкретного интерпретатора; некоторые потенциально опасные функции, например, управление окнами, должны выполняться над этими окнами в контексте интерпретатора.

Команда interp предоставляет решение этой проблемы в виде скрытых команд. Вместо того чтобы полностью удалить опасные команды из безопасного интерпретатора, эти команды скрываются, так что они становятся недоступны для скриптов Tcl, выполняемых в интерпретаторе. Однако такие скрытые команды могут быть вызваны любым доверенным предком безопасного интерпретатора в контексте безопасного интерпретатора с помощью interp invoke. Скрытые и открытые команды находятся в отдельных пространствах имен. Возможно определить скрытую и открытую команду с одинаковым именем в одном интерпретаторе.

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

Так как главный интерпретатор может вызвать скрытую команду в рамках обработки вызова псевдонима, необходимо соблюдать особую осторожность, чтобы избежать оценки каких-либо аргументов, переданных через вызов псевдонима. В противном случае злонамеренные подчиненные интерпретаторы могут заставить доверенный главный интерпретатор выполнить опасные команды от их имени. Более подробное обсуждение этой темы см. в разделе ВЫЗОВ ПСЕВДОНИМОВ. Для предотвращения этой проблемы не применяются подстановки или оценки для аргументов interp invokehidden.

Безопасные интерпретаторы не могут вызывать скрытые команды сами или в своих потомках. Это предотвращает доступ безопасных подчиненных интерпретаторов к скрытой функциональности самих себя или своих потомков.

Множество скрытых команд в интерпретаторе может быть изменено доверенным интерпретатором с помощью interp expose и interp hide. Команда interp expose перемещает скрытую команду в множество открытых команд в интерпретаторе, идентифицируемом по path, потенциально переименовав команду в процессе. Если открытая команда с целевым именем уже существует, операция завершается неудачей. Аналогично, interp hide перемещает открытую команду в множество скрытых команд в этом интерпретаторе. Безопасные интерпретаторы не могут перемещать команды между наборами скрытых и открытых команд, как в самих себе, так и в своих потомках.

В настоящее время имена скрытых команд не могут содержать квалификаторы пространства имен, и вы должны сначала переименовать команду в пространстве имен в глобальное пространство имен, прежде чем сможете её скрыть. Команды, подлежащие скрытию с помощью interp hide, ищутся в глобальном пространстве имен, даже если текущее пространство имен не является глобальным. Это предотвращает подчиненным интерпретаторам обмануть главный интерпретатор, скрывая не ту команду, заставив текущее пространство имен быть отличным от глобального.

Ограничения ресурсов

Каждый интерпретатор имеет два типа ограничений ресурсов, которые могут быть наложены любым главным интерпретатором на своих подчиненных. Ограничения команд (типа command) ограничивают общее количество команд Tcl, которые может выполнить интерпретатор (как можно проверить с помощью команды info cmdcount), а временные ограничения (типа time) устанавливают предел, в котором выполнение внутри интерпретатора должно завершиться. Обратите внимание, что временные ограничения выражаются как абсолютные времена (как в clock seconds), а не относительные времена (как в after), потому что они могут быть изменены после создания.

При превышении ограничения для интерпретатора сначала вызываются обработчики обратного вызова, определенные главными интерпретаторами. Если эти обратные вызовы увеличивают или удаляют ограничение, выполнение внутри (ранее) ограниченного интерпретатора продолжается. Если ограничение по-прежнему действует, в этот момент генерируется ошибка, и обычная обработка ошибок внутри интерпретатора (командой catch) отключается, поэтому ошибка распространяется наружу (создавая стек-трейс по ходу дела) до точки, где был вызван ограниченный интерпретатор (например, interp eval), где ответственность за перехват и обработку ошибки ложится на вызывающий код.

Параметры ограничения

Каждое ограничение имеет ряд параметров, некоторые из которых общие для всех типов ограничений, а другие — специфические для типа ограничения.
-command
Этот параметр (общий для всех типов ограничений) указывает (если не пусто) скрипт Tcl, который будет выполнен в глобальном пространстве имен интерпретатора, читающего и записывающего параметр, когда конкретное ограничение в ограниченном интерпретаторе будет превышено. Обратный вызов может изменить ограничение интерпретатора, если он хочет, чтобы ограниченный интерпретатор продолжал выполнение. Если обратный вызов генерирует исключение, оно сообщается через механизм обработки исключений в фоновом режиме (см. ОБРАБОТКА ИСКЛЮЧЕНИЙ В ФОНОМ РЕЖИМЕ). Обратите внимание, что обратные вызовы, определенные одним интерпретатором, полностью изолированы от обратных вызовов, определенных другим, и порядок вызова этих обратных вызовов не определен.
-granularity
Этот параметр (общий для всех типов ограничений) указывает, как часто (из моментов, когда интерпретатор Tcl находится в согласованном состоянии, где возможно проверка ограничения) фактически проверяется ограничение. Это позволяет настроить частоту проверки ограничения и, следовательно, частоту возникновения накладных расходов на проверку ограничения (которые могут быть значительными в случае временных ограничений).
-milliseconds
Этот параметр указывает количество миллисекунд после момента, определенного в параметре -seconds, когда сработает временное ограничение. Он должен задаваться только в сочетании с параметром -seconds (независимо от того, был ли он установлен ранее или устанавливается в этом вызове.)
-seconds
Этот параметр задаёт количество секунд после эпохи (см. clock seconds), когда будет сработано временное ограничение для интерпретатора. Ограничение будет сработано в начале секунды, если не указан уровень ниже секунды с использованием параметра -milliseconds. Этот параметр может быть пустой строкой, что указывает, что для интерпретатора не установлено временное ограничение.
-value
Этот параметр задаёт количество команд, которые может выполнить интерпретатор, прежде чем сработает ограничение по командам. Этот параметр может быть пустой строкой, что указывает, что для интерпретатора не установлено ограничение по командам.

Когда интерпретатор с заданным ограничением ресурсов создаёт подчиненный интерпретатор, на этом подчиненном интерпретаторе будут наложены ограничения ресурсов, по крайней мере, такие же жёсткие, как и на создающем его главном интерпретаторе. Если главный интерпретатор ограниченного главного интерпретатора хочет ослабить эти условия, он должен скрыть команду interp в дочернем элементе, а затем использовать псевдонимы и подкоманду interp invokehidden, чтобы предоставить такой доступ к команде interp ограниченному главному интерпретатору по мере необходимости.

Обработка исключений в фоновом режиме

Когда исключение возникает в ситуации, когда его нельзя сообщить непосредственно по стеку (например, при обработке событий в вызове update или vwait), исключение вместо этого сообщается через механизм обработки исключений в фоновом режиме. Каждый интерпретатор имеет зарегистрированный обработчик исключений в фоновом режиме; по умолчанию обработчик исключений организует вызов команды bgerror в глобальном пространстве имен интерпретатора, но могут быть установлены и другие обработчики исключений, которые обрабатывают исключения в фоновом режиме совершенно по-другому.

Обработчик исключений в фоновом режиме состоит из непустого списка слов, к которому во время вызова будут добавлены ещё два слова. Первое слово будет результатом интерпретатора во время возникновения исключения, обычно сообщение об ошибке, а второе — словарь параметров возврата во время возникновения исключения. Это те же значения, которые catch может захватить, когда оно управляет оценкой скрипта не в фоновом режиме. Полученный список затем выполняется в глобальном пространстве имен интерпретатора без дальнейших подстановок.

Авторы

Механизм безопасного интерпретатора основан на прототипе Safe-Tcl, реализованном Натаниэлем Борештейном и Маршаллом Розом.

Примеры

Создание и использование псевдонима для команды в текущем интерпретаторе:
interp alias {} getIndex {} lsearch {alpha beta gamma delta}
set idx [getIndex delta]

Выполнение произвольной команды в безопасном интерпретаторе, где каждый вызов lappend регистрируется:

set i [interp create -safe]
interp hide $i lappend
interp alias $i lappend {} loggedLappend $i
proc loggedLappend {i args} {
    puts "logged invocation of lappend $args"
    interp invokehidden $i lappend {*}$args
}
interp eval $i $someUntrustedScript

Установка ограничения ресурсов на интерпретатор, чтобы цикл бесконечной длины завершился.

set i [interp create]
interp limit $i command -value 1000
interp eval $i {
    set x 0
    while {1} {
        puts "Counting up... [incr x]"
    }
}

См. также

bgerror, load, безопасный, Tcl_CreateSlave, Tcl_Eval, Tcl_BackgroundException

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/interp.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/interp.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API