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.

服 务 器 在 那 里 能 找 的 到 。) 有 趣 的 问 题 是 如 果 所 有 当 事 人 都 健 在 并 且 试 图 相 互 通 讯 时 该 怎 么办 。 如 果 对 各 自 说 话 的 顺 序 没 有 一 些 规 定 的 话 , 就 根 本 不 可 能 有 可 靠 的 交 流 ; 这 样 的 规 定 可以 通 过 文 件 锁 来 实 现 , 我 们 将 在 下 一 节 介 绍 。 在 其 后 一 节 里 , 我 们 将 讨 论 父 进 程 和 其 子 进 程之 间 存 在 的 特 殊 关 系 , 这 些 关 系 可 以 让 相 关 的 当 事 人 通 过 对 相 同 文 件 继 承 的 访 问 交 换 信 息 。文 件 当 然 有 其 缺 点 , 比 如 远 程 访 问 , 同 步 , 可 靠 性 和 会 话 管 理 等 。 本 章 其 他 节 介 绍 那 些 着 眼于 解 决 这 些 问 题 的 不 同 IPC 机 制 。16.2.1 文 件 锁 定在 一 个 多 任 务 环 境 里 , 你 需 要 很 小 心 地 避 免 与 其 他 试 图 使 用 你 正 在 用 的 文 件 的 进 程 冲 突 。 如果 所 有 进 程 都 只 读 取 文 件 内 容 , 那 么 大 家 相 安 无 事 , 但 是 如 果 有 哪 怕 只 有 一 个 进 程 需 要 写 该文 件 , 那 么 随 后 就 会 发 生 混 乱 —— 除 非 使 用 某 种 排 序 机 制 充 当 交 通 警 察 的 角 色 。绝 对 不 要 只 是 使 用 文 件 是 否 存 在 ( 也 就 是 -e $file) 当 作 文 件 锁 的 标 志 , 因 为 在 测 试 文 件 名是 否 存 在 和 你 计 划 的 处 理 ( 比 如 创 建 , 打 开 , 或 者 删 除 它 ) 之 间 存 在 冲 突 条 件 。 参 阅 第 二 十三 章 , 安 全 , 中 的 “ 处 理 冲 突 条 件 ”, 获 取 更 多 相 关 信 息 。<strong>Perl</strong> 的 可 移 植 锁 定 接 口 是 flock(HANDLE,FLAGS) 函 数 , 在 第 二 十 九 章 , 函 数 , 里 描 述 。<strong>Perl</strong> 只 采 用 那 些 在 最 广 范 围 的 平 台 上 都 能 找 到 的 最 简 单 的 锁 定 机 制 , 因 此 获 得 了 最 大 的 可移 植 性 。 这 些 语 意 简 单 得 可 以 在 绝 大 部 分 系 统 上 使 用 , 包 括 那 些 不 支 持 这 些 传 统 系 统 调 用 的平 台 , 比 如 System V 或 Windows NT。( 如 果 你 运 行 的 Microsoft 的 系 统 是 早 于 NT的 平 台 , 那 么 你 很 可 能 没 有 这 些 系 统 调 用 支 持 , 就 好 象 你 运 行 Mac OS X 以 前 的 苹 果 系 统一 样 。)锁 有 两 种 变 体 , 共 享 (LOCK_SH 标 志 ) 和 排 它 (LOCK_EX 标 志 )。 尽 管 听 着 有 “ 排 它 ”的 意 思 , 但 是 进 程 并 不 需 要 服 从 对 文 件 的 锁 。 也 就 是 说 ,flock 只 是 实 现 了 劝 告 性 的 锁 定 ,劝 告 性 的 锁 定 , 也 就 意 味 着 锁 定 一 个 文 件 并 不 阻 止 其 他 的 进 程 读 取 甚 至 是 写 入 该 文 件 。 进 程请 求 一 个 排 它 锁 只 是 让 操 作 系 统 推 迟 它 对 文 件 的 处 理 , 直 到 所 有 当 前 的 锁 持 有 者 , 不 管 是 共享 锁 还 是 排 它 锁 , 都 完 成 操 作 以 后 才 进 行 。 类 似 地 , 如 果 一 个 进 程 请 求 一 个 共 享 锁 , 它 只 是推 迟 处 理 直 到 没 有 排 它 锁 存 在 。 只 有 所 有 当 事 人 都 使 用 文 件 锁 机 制 的 时 候 , 你 才 能 安 全 地 访问 一 个 有 内 容 的 文 件 。因 此 ,flock 缺 省 时 是 一 个 阻 塞 操 作 。 也 就 是 说 , 如 果 你 不 能 立 即 获 取 你 需 要 的 锁 , 操 作 系统 会 推 迟 你 的 处 理 , 直 到 你 能 够 获 得 锁 为 止 。 下 面 是 如 何 获 取 阻 塞 的 共 享 锁 的 方 法 , 通 常 用于 读 取 文 件 :use Fcntl qw(:DEFAULT :flock);open(FH, "< filename") or die "can't open filename: $!";417

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

Saved successfully!

Ooh no, something went wrong!