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.

如 果 你 真 的 希 望 新 程 序 能 够 获 取 除 了 上 面 三 个 之 外 的 文 件 句 柄 的 访 问 权 限 , 你 也 能 做 到 , 不过 你 必 须 做 两 件 事 之 一 。 当 <strong>Perl</strong> 打 开 一 个 新 文 件 ( 或 者 管 道 和 套 接 字 ) 的 时 候 , 它 检 查 变量 $^F($SYSTEM_FD_MAX) 的 当 前 设 置 。 如 果 新 文 件 句 柄 用 的 数 字 文 件 描 述 符 大 于 那个 $^F, 该 描 述 符 就 标 记 为 一 个 要 关 闭 的 。 否 则 ,<strong>Perl</strong> 就 把 它 放 着 , 并 且 你 exec 出 来的 新 的 程 序 就 会 继 承 访 问 。通 常 很 难 预 料 你 新 创 建 的 文 件 句 柄 是 什 么 , 但 是 你 可 以 在 open 期 间 暂 时 把 你 的 最 大 系 统文 件 描 述 符 数 设 置 的 非 常 大 :# 打 开 文 件 并 且 把 INPUT 标 记 为 在 exec 之 间 可 以 使 用{local $^F = 10_000;open(INPUT, "< /etc/motd") or die "/etc/motd: $!";} # 在 范 围 退 出 后 , 恢 复 旧 的 $^F 值现 在 你 所 要 干 的 就 是 让 新 程 序 关 照 你 刚 刚 打 开 的 文 件 句 柄 的 文 件 描 述 符 。 最 干 净 的 解 决 方 法( 在 那 些 支 持 这 些 的 系 统 上 ) 就 是 传 递 一 个 文 件 名 是 刚 创 建 的 文 件 描 述 符 的 特 殊 文 件 。 如 果你 的 系 统 有 一 个 目 录 叫 /dev/fd 或 者 /proc/$$/fd, 里 面 包 含 从 了 0 到 你 的 系 统 支 持 的最 大 文 件 描 述 符 数 字 , 那 么 你 就 可 能 可 以 使 用 这 个 方 法 。( 许 多 Linux 系 统 两 个 都 有 , 但是 好 象 只 有 /proc 的 版 本 是 正 确 填 充 的 。 BSD 和 Solaris 喜 欢 用 /dev/fd。 你 最 好 自己 看 看 你 的 系 统 , 检 查 一 下 你 的 系 统 是 哪 种 情 况 。) 首 先 , 用 我 们 前 面 显 示 的 代 码 打 开 一 个文 件 句 柄 并 且 把 它 标 记 成 一 个 可 以 在 exec 之 间 传 递 的 句 柄 , 然 后 用 下 面 的 方 法 分 裂 进 程 :if ($pid = fork) { wait }else {defined($pid) or die "fork: $!";$fdfile = "/dev/fd/" . fileno(INPUT);exec("cat", "-n", $fdfile) or die "exec cat: $!";}如 果 你 的 系 统 支 持 fcntl 系 统 调 用 , 你 就 可 以 手 工 骗 过 文 件 句 柄 在 exec 时 候 的 关 闭 标 志了 。 如 果 你 创 建 了 文 件 句 柄 而 且 还 想 与 你 的 子 进 程 共 享 , 但 是 早 些 时 候 你 还 没 有 意 识 到 想 共享 句 柄 的 场 合 下 , 这 个 方 法 特 别 方 便 。use Fcntl qw/F_SETFD/;423

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

Saved successfully!

Ooh no, something went wrong!