______________________________________________________________________________
NAME
load - 装 载 机 器 代 码 并 初 始 化 新 命 令 。
总 览 SYNOPSIS
load
fileName
load fileName packageName
load fileName packageName interp
_________________________________________________________________
描 述 DESCRIPTION
这 个 命 令 把 二 进 制 代 码 从 一 个 文 件 装 载 到 应 用 的 地 址 空 间 中 并 调 用 在 包 (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);
interp 参 数 标 识 在 其 中 装 载 包 的 解 释 器 。 初 始 化 过 程 必 须 返 回 TCL_OK 或 TCL_ERROR 来 指 示 是 否 成 功 完 成 ; 在 有 错 误 的 情 况 下 , 应 把 解 释 器 的 结 果 设 置 为 指 向 一 个 错 误 消 息 。 初 始 化 过 程 返 回 的 结 果 就 是 load 命 令 的 结 果 。 在 一 个 应 用 中 对 每 个 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 选 择 被 最 先 │ 装 载 的 文 件 。
移 植 要 点 PORTABILITY ISSUES
Windows 在 装 载 出 现 "library not found" 错 误 的 时 候 , 也 有 可 能 是 没 找 到 一 个 依 赖 库 。 要 查 看 依 赖 库 , 在 一 个 DOS 控 制 台 中 “dumpbin -imports <dllname>”来 查 看 必 须 导 入 那 些 库 。 在 当 前 目 录 中 装 载 一 个 DLL 的 时 候 , Windows 将 忽 略 作 为 一 个 路 径 指 定 符 (specifier)的 “./”, 转 而 使 用 一 次 启 发 式 (heuristic)的 查 找 来 找 到 这 个 DLL。 要 避 免 如 此 , 装 载 DLL 就 要 用
load [file join [pwd] mylib.DLL]
BUGS
如 果 以 不 同 的 fileNames 装 载 同 一 个 文 件 , 它 将 被 多 次 载 入 这 个 进 程 的 地 址 空 间 。 在 不 同 的 系 统 上 装 载 的 行 为 是 不 同 的 (一 些 系 统 可 以 检 测 多 余 的 装 载 , 其 他 的 可 能 不 能 )。
参 见 SEE ALSO
info sharedlibextension, Tcl_StaticPackage(3), safe(n)
关 键 字 KEYWORDS
binary code, loading, safe interpreter, shared library
[中 文 版 维 护 人 ]
寒 蝉 退 士
[中 文 版 最 新 更 新 ]
2001/08/30
《 中 国 Linux 论 坛 man 手 册 页 翻 译 计 划 》 :
跋
本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh