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.

<strong>Perl</strong> 使 用 一 种 简 单 的 信 号 处 理 模 型 : 在 %SIG 散 列 里 包 含 指 向 用 户 定 义 信 号 句 柄 的 引 用( 符 号 或 者 硬 引 用 )。 某 些 事 件 促 使 操 作 系 统 发 送 一 个 信 号 给 相 关 的 进 程 。 这 时 候 对 应 该 事件 的 句 柄 就 会 被 调 用 , 给 该 句 柄 的 参 数 中 就 有 一 个 包 含 触 发 它 的 信 号 名 字 。 要 想 给 另 外 一 个进 程 发 送 一 个 信 号 , 你 可 以 用 kill 函 数 。 把 这 个 过 程 想 象 成 是 一 个 给 其 他 进 程 发 送 一 个 二进 制 位 信 息 的 动 作 。( 注 : 实 际 上 , 更 有 可 能 是 五 或 者 六 个 二 进 制 位 , 取 决 于 你 的 OS 定义 的 信 号 数 目 以 及 其 他 进 程 是 否 利 用 了 你 不 发 送 别 的 信 号 的 这 个 情 况 。)。 如 果 另 外 一 个 进程 安 装 了 一 个 处 理 该 信 号 的 信 号 句 柄 , 那 么 如 果 收 到 该 信 号 , 它 就 能 够 执 行 代 码 。 不 过 发 送进 程 没 有 任 何 办 法 获 取 任 何 形 式 的 返 回 , 它 只 能 知 道 该 信 号 已 经 合 法 发 送 出 去 了 。 发 送 者 也接 收 不 到 任 何 接 收 进 程 对 该 信 号 做 的 处 理 的 信 息 。我 们 把 这 个 设 施 归 类 为 IPC 的 一 种 , 但 实 际 上 信 号 可 以 来 自 许 多 源 头 , 而 不 仅 仅 是 其 他 进程 。 一 个 信 号 也 可 能 来 自 你 自 己 的 进 程 , 或 者 是 用 户 在 键 盘 上 敲 入 了 某 种 特 定 键 盘 序 列 , 比如 Control-C 或 者 Control-Z 造 成 的 , 也 可 能 是 内 核 在 处 理 某 些 特 殊 事 件 的 时 候 产 生的 , 比 如 子 进 程 退 出 或 者 你 的 进 程 用 光 堆 栈 或 者 达 到 了 文 件 尺 寸 或 内 存 的 极 限 等 。 不 过 你 自己 的 进 程 可 以 很 容 易 区 别 这 些 场 合 。 信 号 就 好 象 一 个 送 到 你 家 门 口 的 没 有 返 回 地 址 的 神 秘 包裹 。 你 打 开 的 时 候 最 好 小 心 一 点 。因 为 在 %SIG 里 的 记 录 可 能 是 硬 链 接 , 所 以 通 常 把 匿 名 函 数 用 做 信 号 句 柄 :$SIG{INT} = sub {die "\nOutta here1\n"};$SIG{ALRM} = sub { die "Your alarm clock went off" };或 者 你 可 以 创 建 一 个 命 名 函 数 , 并 且 把 它 的 名 字 或 者 引 用 放 在 散 列 里 的 合 适 的 槽 位 里 。 比 如 ,要 截 获 中 断 和 退 出 信 号 ( 通 常 和 你 的 键 盘 的 Control-C 和 Control-\ 绑 在 一 起 ), 你 可以 这 样 设 置 句 柄 :sub catch_zap {my $signame = shift;our $shucks++;die "Somebody sent me a SIG$signame!";}$shucks = 0;$SIG{INT} = 'catch_zap';$SIG{INT} = \&catch_zap;# 意 思 总 是 &main::catch_zap# 最 好 的 方 法410

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

Saved successfully!

Ooh no, something went wrong!