load(3tcl) | Tcl Built-In Commands | load(3tcl) |
load - 装载机器代码并初始化新命令。
load fileName
load fileName packageName
load fileName packageName interp
这个命令把二进制代码从一个文件装载到应用的地址空间中并调用在包(package)中的初始化过程来把它加入到解释器中。fileName 是包含代码的文件的名字;它准确的形式在不同的系统上是不同的,但在多数系统上是一个共享库,例如,在 Solaris 下的 .so 文件或在 Windows 下的一个 DLL。packageName 是包的名字,并被用于计算初始化过程的名字。interp 是要在其中装载包的解释器的路径名(详情参见 interp 手册条目);如果省略了 interp ,它的缺省是在其中调用 load 命令的那个解释器。
一旦已经被装载到应用的地址空间中,两个初始化过程之一将在新代码中被调用。典型的,初始化进程将向一个 Tcl 解释器添加新命令。初始化过程的名字由 packageName 和目标解释器是否是安全解释器来确定。对于通常的解释器,初始化过程的名字的形式是 pkg_Init,这里 pkg 与 packageName 相同,但是第一个字母被转换成大写而所有其他字母被转换成小写。例如,如果 packageName 是 foo 或 FOo,则初始化过程的名字将是 Foo_Init。
如果目标解释器是一个安全解释器,则初始化过程的名字将是 pkg_SafeInit 而不是 pkg_Init。写 pkg_SafeInit 函数要仔细,在包中提供的功能中,只用由不可信任的代码使用是安全的的那部分初始化安全解释器。 关于 Safe-Tcl 的详细的信息,请参见 safe 手册条目。
初始化过程必须匹配下列原型 (prototype):
typedef int Tcl_PackageInitProc(Tcl_Interp *interp);
在一个应用中对每个 fileName 只进行一次文件的实际装载。如果一个给定的 fileName 被装载到多个解释器中,则第一个 load 将装载代码并调用初始化过程;随后的 load 将调用初始化过程而不再次装载代码 。不可能卸载或重载一个包。
load 命令还支持同应用静态连接的包,条件是这些包已经通过调用 Tcl_StaticPackage 过程注册过了。如果 fileName 是一个空串,则必须指定packageName 。
如果省略了 packageName
或被指定为一个空串,Tcl
尝试着猜出包的名字。在不同的平台上可能是不同的。在多数
UNIX
平台上,缺省的猜测是接受
fileName
的最后的组成部分,如果前三个字符是
lib
就去掉它们,使用所有随后的
字母和下划线作为模块的名字。
例如,命令 load libxyz4.2.so
使用模块名 xyz 而命令
load bin/last.so {} 使用模块名
last。
如果 fileName 是一个空串,则必须指定 packageName。load 命令首先用这个名字查找一个静态装载包(通过调用 Tcl_StaticPackage 过程注册的包);如果找到了就使用它。否则,load 命令用这个名字查找动态装载包,如果找到就使用它。如果一些不同的文件被装载成包的不同版本,Tcl 选择被最先装载的文件。
load [file join [pwd] mylib.DLL]
如果以不同的fileNames 装载同一个文件,它将被多次载入这个进程的地址空间。在不同的系统上装载的行为是不同的(一些系统可以检测多余的装载,其他的可能不能)。
info sharedlibextension, Tcl_StaticPackage(3), safe(n)
binary code, loading, safe interpreter, shared library
寒蝉退士
2001/08/30
http://cmpp.linuxforum.net
本页面中文版由中文
man 手册页计划提供。
中文 man
手册页计划:https://github.com/man-pages-zh/manpages-zh
7.5 | Tcl |