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.

尽 管 有 这 些 痛 苦 , 古 老 的 Sys IPC 仍 然 有 好 几 种 有 效 的 用 途 。 三 种 IPC 对 象 是 共 享 内 存 ,信 号 灯 和 消 息 。 对 于 传 送 消 息 , 目 前 套 接 字 是 更 好 的 机 制 , 而 且 移 植 性 也 更 好 。 对 于 简 单 的信 号 灯 用 途 , 用 文 件 系 统 更 好 。 对 于 共 享 内 存 -- 现 在 还 有 点 问 题 。 如 果 你 的 系 统 支 持 , 用 更现 代 的 mmap(2) 更 好 ,( 注 : 在 CPAN 上 甚 至 有 一 个 Mmap 模 块 。) 但 是 这 些 实 现的 质 量 因 系 统 而 异 。 而 且 它 还 需 要 更 小 心 一 些 , 以 免 让 <strong>Perl</strong> 从 mmap(2) 放 你 的 字 串 的位 置 再 次 分 配 它 们 。 但 当 程 序 员 准 备 使 用 mmap(2) 的 时 候 , 他 们 会 听 到 那 些 常 用 这 个 的老 鸟 嘀 咕 , 说 自 己 是 如 何 如 何 地 绕 开 那 些 没 有 “ 统 一 缓 冲 缓 存 ”( 或 者 叫 “ 统 一 总 线 捕 蝇 器 ”)的 系 统 上 的 缓 冲 一 致 性 问 题 , 还 有 , 他 们 讲 他 们 知 道 的 问 题 要 比 描 述 他 们 不 懂 的 东 西 说 得 还要 好 , 然 后 新 手 就 赶 快 退 回 Sys V IPC 并 且 憎 恨 所 有 他 们 必 须 使 用 的 共 享 内 存 。下 面 是 一 个 小 程 序 , 它 演 示 了 一 窝 兄 妹 进 程 对 一 个 共 享 内 存 缓 冲 的 有 控 制 的 访 问 。Sys VIPC 对 象 也 可 以 在 同 一 台 计 算 机 的 不 相 关 的 进 程 之 间 共 享 , 不 过 那 样 的 话 你 就 得 想 出 它 们相 互 之 间 找 到 对 方 的 方 法 。 为 了 保 证 安 全 的 访 问 , 我 们 将 为 每 块 内 存 创 建 一 个 信 号 灯 。( 注 :可 能 给 每 块 内 存 创 建 一 对 信 号 灯 更 现 实 : 一 个 用 于 读 而 另 外 一 个 用 于 写 , 而 且 实 际 上 , 这 就是 在 CPAN 上 的 IPC::Shareable 模 块 所 用 的 方 法 。 但 是 我 们 想 在 这 里 保 持 简 单 些 。 不过 我 们 要 承 认 , 如 果 使 用 一 对 信 号 灯 , 你 就 可 以 利 用 好 SysV ? IPC 唯 一 的 优 点 : 你 可 以 在整 个 信 号 灯 集 上 执 行 原 子 操 作 , 就 好 象 它 们 是 一 个 单 元 一 样 , 这 一 点 有 时 候 很 有 用 。)每 当 你 想 获 取 或 者 写 入 新 值 到 共 享 内 存 里 面 , 你 就 必 须 先 通 过 信 号 灯 这 一 关 。 这 个 过 程 可 能非 常 乏 味 , 所 以 我 们 将 把 访 问 封 装 在 一 个 对 象 类 里 面 。 IPC::Shareable 更 进 一 步 , 把 它的 对 象 封 装 在 一 个 tie 接 口 里 。下 面 的 程 序 会 一 直 运 行 , 直 到 你 用 一 个 Control-C 或 者 相 当 的 东 西 终 止 它 :#! /usr/bin/perl -wuse v5.6.0;# 或 者 更 新use strict;use sigtrap wq(die INT TERM HUP QUIT);my $PROGENY= shift(@ARGV) || 3;eval { main() };# 参 阅 下 面 的 DESTROY 找 原 因die if $@ && $@ !~ /^Caught a SIG/;print "\nDone.\n";exit;437

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

Saved successfully!

Ooh no, something went wrong!