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.

另 外 一 个 有 趣 的 信 号 是 信 号 数 0。 它 实 际 上 不 影 响 目 标 进 程 , 只 是 检 查 一 下 , 看 看 那 个 进程 是 否 还 活 着 或 者 是 是 否 改 变 了 UID。 也 就 是 说 , 它 判 断 给 目 标 进 程 发 送 信 号 是 否 合 法 ,而 实 际 上 并 不 真 正 发 送 信 号 。unless ( kill 0 => $kid_pid ) {warn "something wicked happened to $kid_pid";}信 号 0 是 唯 一 的 一 个 在 Unix 上 和 Windows 上 的 <strong>Perl</strong> 移 植 作 用 一 样 的 信 号 。 在Microsoft 系 统 里 ,kill 实 际 上 并 不 发 送 信 号 。 相 反 , 它 强 迫 目 标 进 程 退 出 , 而 退 出 状 态 由信 号 数 标 明 。 这 些 东 西 以 后 都 会 修 改 。 但 是 , 神 奇 的 0 信 号 将 依 然 如 故 , 表 现 出 非 破 坏 性的 特 性 。16.1.2 收 割 僵 死 进 程当 一 个 进 程 退 出 的 时 候 , 内 核 向 它 的 父 进 程 发 送 一 个 CHLD 信 号 然 后 该 进 程 就 成 为 一 个 僵死 进 程 (zombie, 注 : 这 是 一 个 技 术 术 语 ), 直 到 父 进 程 调 用 wait 或 者 waitpid。 如 果你 在 <strong>Perl</strong> 里 面 启 动 新 进 程 用 的 不 是 fork, 那 么 <strong>Perl</strong> 就 会 替 你 收 割 这 些 僵 死 进 程 , 但 是如 果 你 用 的 是 一 个 fork, 那 么 就 得 自 己 做 清 理 工 作 。 在 许 多 ( 但 不 是 全 部 ) 内 核 上 , 自 动收 割 的 最 简 单 办 法 就 是 把 $SIG{CHLD} 设 置 为 'IGNORE'。 另 一 个 更 简 单 ( 但 也 更 乏 味 )的 方 法 是 你 自 己 收 割 它 们 。 因 为 在 你 开 始 处 理 的 时 候 , 可 能 有 不 止 一 个 子 进 程 已 经 完 蛋 了 ,所 以 , 你 必 须 在 一 个 循 环 里 收 割 你 的 子 进 程 直 到 没 有 更 多 为 止 :use POSIX ":sys_wait_h";sub REAPER { 1 until waitpid(-1, WNOHANG) == -1) }想 根 据 需 要 运 行 这 些 代 码 , 你 要 么 可 以 给 它 设 置 CHLD 信 号 :$SIG{CHLD} =\&REAPER;或 者 如 果 你 的 程 序 是 在 一 个 循 环 里 运 行 , 那 你 只 需 要 循 环 调 用 收 割 器 就 行 了 。 这 个 方 法 最 好 ,因 为 它 避 免 了 那 些 信 号 可 能 触 发 的 在 C 库 里 偶 然 的 核 心 转 储 。 但 是 , 如 果 在 一 个 很 快 速 的循 环 里 调 用 , 这 样 做 的 开 销 是 巨 大 的 , 所 以 一 种 合 理 的 折 衷 是 用 一 种 混 合 的 方 法 : 你 在 句 柄里 尽 可 能 少 做 处 理 , 把 风 险 降 到 最 低 , 同 时 在 外 部 循 环 中 等 待 收 割 僵 死 进 程 :our $zombies = 0;$SIG{CHLD} = sub { $zombies++};413

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

Saved successfully!

Ooh no, something went wrong!