13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

$SIG{QUIT} = \&catch_zap;# 把 另 外 一 个 信 号 也 捕 获 上注 意 , 我 们 在 信 号 句 柄 里 做 的 所 有 事 情 就 是 设 置 一 个 全 局 变 量 然 后 用 die 抛 出 一 个 例 外 。如 果 可 能 , 请 力 争 避 免 处 理 比 这 更 复 杂 的 东 西 , 因 为 在 大 多 数 系 统 上 ,C 库 都 是 不 可 再 入的 。 信 号 是 异 步 传 送 的 ( 注 : 与 <strong>Perl</strong> 层 操 作 码 同 步 的 信 号 传 递 安 排 在 以 后 的 版 本 发 布 , 那样 应 该 能 解 决 信 号 和 核 心 转 储 的 问 题 。), 所 以 , 如 果 信 号 传 递 后 你 已 经 在 一 个 相 关 的 C 库过 程 里 面 了 , 那 么 调 用 任 何 print 函 数 ( 或 者 只 是 任 何 需 要 malloc(3) 分 配 更 多 内 存 的函 数 ) 在 理 论 上 都 可 能 触 发 内 存 错 误 并 导 致 内 核 转 储 。( 甚 至 可 能 die 过 程 也 有 点 有 点 不安 全 —— 除 非 该 进 程 是 在 一 个 eval 里 执 行 的 , 因 为 那 样 会 消 除 来 自 die 的 I/O, 于 是 就让 它 无 法 调 用 C 库 。)一 个 更 简 单 的 捕 获 信 号 的 方 法 是 使 用 sigtrap 用 法 安 装 简 单 的 缺 省 信 号 句 柄 :use sigtrap qw(die INT QUIT);use sigtrap qw(die untrapped normal-signals stack-trace any error-signals);如 果 你 嫌 写 自 己 的 句 柄 麻 烦 , 那 就 可 以 用 这 个 用 法 , 不 过 你 仍 然 会 希 望 捕 获 危 险 的 信 号 并 且执 行 一 个 正 常 的 关 闭 动 作 。 缺 省 时 , 这 些 信 号 中 的 一 部 分 对 你 的 进 程 是 致 命 的 , 当 的 程 序 收到 这 样 的 信 号 时 只 能 停 止 。 糟 糕 的 是 , 这 也 意 味 着 不 会 调 用 任 何 用 做 退 出 控 制 的 END 函数 和 用 于 对 象 终 止 的 DESTROY 方 法 。 但 是 它 们 在 正 常 的 <strong>Perl</strong> 例 外 中 的 确 是 被 调 用 的( 比 如 你 调 用 die 的 时 候 ), 所 以 , 你 可 以 用 这 个 用 法 无 痛 地 把 信 号 转 换 成 例 外 。 甚 至 在你 没 有 自 己 处 理 这 些 信 号 的 情 况 下 , 你 的 程 序 仍 然 能 够 表 现 正 确 。 参 阅 第 三 十 一 章 , 用 法 模块 , 里 use sigtrap 的 描 述 获 取 这 个 用 法 的 更 详 细 的 特 性 。你 还 可 以 把 %SIG 句 柄 设 置 为 字 串 “IGNORE” 或 者 “DEFAULT”, 这 样 ,<strong>Perl</strong> 就 会 试 图 丢弃 该 信 号 或 者 允 许 用 缺 省 动 作 处 理 该 信 号 ( 不 过 有 些 信 号 既 不 能 捕 获 , 也 不 能 忽 略 , 比 如KILL 和 STOP 信 号 ; 如 果 手 边 有 资 料 , 你 可 以 参 阅 signal(3), 看 看 你 的 系 统 可 以 用 的信 号 列 表 和 它 们 的 缺 省 行 为 。)操 作 系 统 认 为 信 号 是 一 个 数 字 , 而 不 是 一 个 名 字 , 但 是 <strong>Perl</strong> 和 大 多 数 人 一 样 , 喜 好 符 号 名字 , 而 讨 厌 神 秘 的 数 字 。 如 果 想 找 出 信 号 的 名 字 , 你 可 以 把 %SIG 散 列 里 的 键 字 都 列 出 来 ,或 者 如 果 你 的 系 统 里 有 kill 命 令 , 你 可 以 用 kill -l 把 它 们 列 出 来 。 你 还 可 以 使 用 <strong>Perl</strong> 标准 的 Config 模 块 来 检 查 你 的 操 作 系 统 的 信 号 名 字 和 信 号 数 字 之 间 的 映 射 。 参 阅 Config(3)获 取 例 子 。因 为 %SIG 是 一 个 全 局 的 散 列 , 所 以 给 它 赋 值 将 影 响 你 的 整 个 程 序 。 如 果 你 把 信 号 捕 获 局限 于 某 个 范 围 , 可 能 对 你 的 程 序 的 其 他 部 分 更 有 好 处 。 实 现 这 个 目 的 的 方 法 是 用 一 个 local信 号 句 柄 赋 值 , 这 样 , 一 旦 退 出 了 闭 合 的 语 句 块 , 那 么 该 句 柄 就 失 去 作 用 了 。( 但 是 要 记 住 ,local 变 量 对 那 些 语 句 块 中 调 用 的 函 数 是 可 见 的 。)411

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!