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 |