unload
-
НАЗВАНИЕ
- unload — Выгрузка машинного кода
- СИНТАКСИС
- ОПИСАНИЕ
-
-nocomplain
- -keeplibrary
- --
- -keeplibrary
- ОПЕРАЦИЯ ВЫГРУЗКИ
- ПРОТОТИП ОБРАБОТЧИКА ВЫГРУЗКИ
- ПРИМЕЧАНИЯ
- ПРОБЛЕМЫ ПЕРЕНОСИМОСТИ
- Unix
- ОШИБКИ
- ПРИМЕР
- СМОТРИТЕ ТАКЖЕ
- КЛЮЧЕВЫЕ СЛОВА
Имя
unload — Выгрузка машинного кодаСинтаксис
unload ?переключатели? имяФайлаunload ?переключатели? имяФайла имяПакет
unload ?переключатели? имяФайла имяПакет интерпретатор
Описание
Эта команда пытается выгрузить из адресного пространства приложения общие библиотеки, ранее загруженные с помощью команды load. имяФайла — имя файла, содержащего библиотеку, которую нужно выгрузить; оно должно совпадать с именем файла, предоставленным команде load для загрузки библиотеки. Аргумент имяПакет — имя пакета (определяется или передается команде load) и используется для вычисления имени процедуры выгрузки; если не указан, вычисляется из имяФайла так же, как и в команде load. Аргумент интерпретатор — имя пути интерпретатора, из которого нужно выгрузить пакет (см. руководство по команде interp для получения подробностей); если интерпретатор опущен, он по умолчанию устанавливается в интерпретатор, в котором была запущена команда unload.Если начальные аргументы команды unload начинаются с -, они интерпретируются как переключатели. В настоящее время поддерживаются следующие переключатели:
- -nocomplain
- Отключает все сообщения об ошибках. Если этот переключатель задан, unload никогда не сообщает об ошибке.
- -keeplibrary
- Этот переключатель предотвратит выполнение вызова операционной системы, который выгрузит библиотеку из процесса.
- --
- Помечает конец переключателей. Аргумент, следующий за этим, будет обрабатываться как имяФайла, даже если он начинается с -.
Операция выгрузки
Когда файл, содержащий общую библиотеку, загружается с помощью команды load, Tcl связывает с файлом библиотеки два счетчика ссылок. Первый счетчик показывает, сколько раз библиотека была загружена в обычные (доверенные) интерпретаторы, а второй — сколько раз в безопасные интерпретаторы. Поскольку файл, содержащий общую библиотеку, может быть загружен Tcl только один раз (с помощью первого вызова load для файла), эти счетчики отслеживают, сколько интерпретаторов используют библиотеку. Каждый последующий вызов load после первого просто увеличивает соответствующий счетчик ссылок.Команда unload работает в обратном направлении. В качестве первой операции unload проверяет, можно ли выгрузить библиотеку: выгружаемая библиотека экспортирует специальную процедуру выгрузки. Имя процедуры выгрузки определяется параметром имяПакет и тем, является ли целевой интерпретатор безопасным. Для обычных интерпретаторов имя процедуры инициализации будет иметь вид pkg_Unload, где pkg совпадает с имяПакет, за исключением того, что первая буква преобразуется в верхний регистр, а все остальные — в нижний. Например, если имяПакет равен foo или FOo, имя процедуры инициализации будет Foo_Unload. Если целевой интерпретатор является безопасным, то имя процедуры инициализации будет pkg_SafeUnload вместо pkg_Unload.
Если unload определяет, что библиотека не выгружается (или функция выгрузки была отключена во время компиляции), будет возвращена ошибка. Если библиотека выгружается, unload вызовет процедуру выгрузки. Если процедура выгрузки возвращает TCL_OK, unload продолжит и уменьшит соответствующий счетчик ссылок (в зависимости от типа целевого интерпретатора). Когда оба счетчика ссылок достигнут 0, библиотека будет отсоединена от процесса.
Прототип обработчика выгрузки
Процедура выгрузки должна соответствовать следующему прототипу:typedef int Tcl_PackageUnloadProc(
Tcl_Interp *interp,
int flags); Аргумент интерпретатор идентифицирует интерпретатор, из которого нужно выгрузить библиотеку. Процедура выгрузки должна возвращать TCL_OK или TCL_ERROR, чтобы указать, выполнилось ли она успешно; в случае ошибки она должна установить результат интерпретатора на указатель на сообщение об ошибке. В этом случае результат команды unload будет результатом, возвращенным процедурой выгрузки.
Аргумент флаги может быть либо TCL_UNLOAD_DETACH_FROM_INTERPRETER, либо TCL_UNLOAD_DETACH_FROM_PROCESS. В случае, если библиотека останется прикрепленной к процессу после возврата процедуры выгрузки (т. е. потому, что библиотека используется другими интерпретаторами), будет определено TCL_UNLOAD_DETACH_FROM_INTERPRETER. Однако, если библиотека используется только целевым интерпретатором и библиотека будет отсоединена от приложения, как только вернется процедура выгрузки, аргумент флаги будет установлен в TCL_UNLOAD_DETACH_FROM_PROCESS.
Примечания
Команда unload не может выгрузить библиотеки, статически связанные с приложением. Если имяФайла является пустой строкой, то должен быть указан аргумент имяПакет.Если имяПакет опущен или указан как пустая строка, Tcl пытается определить имя пакета. Это может выполняться по-разному на разных платформах. По умолчанию, используемое на большинстве платформ Unix, — взять последний элемент имяФайла, удалить первые три символа, если они являются lib, и использовать любые последующие символы и подчеркивания в качестве имени модуля. Например, команда unload libxyz4.2.so использует имя модуля xyz, а команда unload bin/last.so {} использует имя модуля last.
Проблемы переносимости
- Unix
- Не все операционные системы Unix поддерживают выгрузку библиотек. В такой операционной системе unload возвращает ошибку (если не был задан переключатель -nocomplain).
Ошибки
Если один и тот же файл загружается командой load с разными имяФайла, он будет загружен в адресное пространство процесса несколько раз. Поведение этого различается в зависимости от системы (некоторые системы могут обнаружить избыточные загрузки, другие — нет). Если библиотека была тихо отсоединена операционной системой (и в результате Tcl считает, что библиотека по-прежнему загружена), использование команды unload для такой библиотеки может быть небезопасным (поскольку библиотека будет полностью отсоединена от приложения, в то время как некоторые интерпретаторы продолжат ее использовать).Пример
Если выгружаемый модуль в файле foobar.dll был загружен с помощью команды load так (в Windows):load c:/some/dir/foobar.dll
то он был бы выгружен так:
unload c:/some/dir/foobar.dll
Это позволяет временно установить модуль кода C в долго работающую программу Tcl, а затем снова удалить его (либо потому, что он больше не нужен, либо потому, что он обновляется новой версией), не закрывая весь процесс Tcl.
См. также
info sharedlibextension, load, safe
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/unload.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/unload.htm