13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

sub reaper {my $zombie;our %Kid_Status;# 存 储 每 个 退 出 状 态$zombies = 0;while (($zombie = waitpid( -1, WNOHANG)) != -1) {$Kid_Status{$zombie} = $?;}}while(1) {reaper() if $zombies;...}这 段 代 码 假 设 你 的 内 核 支 持 可 靠 信 号 。 老 的 Sys V 风 格 的 信 号 是 不 可 靠 的 , 那 样 的 话 , 想写 正 确 的 信 号 句 柄 几 乎 是 不 可 能 的 。 甚 至 早 在 <strong>Perl</strong> 版 本 5.003, 只 要 可 能 , 我 们 就 开 始使 用 sigaction(2) 系 统 调 用 了 , 因 为 它 更 可 靠 些 。 这 意 味 着 除 非 你 在 一 个 古 老 的 操 作 系 统上 运 行 或 者 跑 的 是 一 个 古 老 的 <strong>Perl</strong> , 你 用 不 着 重 新 安 装 你 的 句 柄 , 也 不 会 冒 丢 失 信 号 的 危险 。 幸 运 的 是 , 所 有 带 BSD 风 格 的 系 统 ( 包 括 Linux,Solaris, 和 Mac OS X) 以 及 所有 POSIX 兼 容 的 系 统 都 提 供 可 靠 的 信 号 , 所 以 那 些 老 旧 的 Sys V 问 题 更 多 是 历 史 遗 留 问题 , 而 不 是 目 前 我 们 要 关 心 的 问 题 。在 新 内 核 上 , 还 有 许 多 其 他 东 西 也 会 运 行 得 更 好 些 。 比 如 ,“ 慢 的 ” 系 统 调 用 ( 那 种 可 以 阻 塞的 , 就 象 read,wait, 和 accept) 如 果 被 一 个 信 号 中 断 后 将 自 动 重 新 启 动 。 在 那 些 灰 暗的 旧 社 会 里 , 用 户 代 码 必 须 记 得 明 确 地 检 查 每 个 慢 的 系 统 调 用 是 否 带 着 $! ($ERRNO) 为EINTR 失 败 的 , 而 且 如 果 是 这 样 , 那 么 重 起 。 而 且 这 样 的 情 况 不 光 对 INT 信 号 , 而 且 对有 些 无 辜 的 信 号 , 比 如 TSTP( 来 自 Control-Z) 或 者 CONT ( 来 自 把 任 务 放 到 前 台 )也 会 退 出 系 统 调 用 。 如 果 操 作 系 统 允 许 , 现 在 <strong>Perl</strong> 自 动 为 你 重 新 启 动 系 统 调 用 。 我 们 通 常认 为 这 是 一 个 特 性 。你 可 以 检 查 一 下 , 看 看 你 的 系 统 是 否 有 更 严 格 的 POSIX 风 格 的 信 号 , 方 法 是 装 载 Config模 块 然 后 检 查 $Config{d_sigaction} 是 否 为 真 。 要 检 查 慢 的 系 统 调 用 是 否 可 以 可 以 重起 , 检 查 你 的 系 统 的 文 档 :sigaction(2) 或 者 sigvec(3), 或 者 在 你 的 C sys/signal.h 里414

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

Saved successfully!

Ooh no, something went wrong!