Manpages

______________________________________________________________________________

NAME

fileevent - 在 一 个 通 道 变 得 可 读 或 可 写 的 时 候 执 行 一 个 脚 本

总 览 SYNOPSIS

fileevent channelId readable ?script?

fileevent channelId writable ?script? _________________________________________________________________

描 述 DESCRIPTION

这 个 命 令 被 用 于 建 立 文 件 事 件 处 理 器 。 一 个 文 件 事 件 处 理 器 (handler)是 在 一 个 通 道 和 一 个 脚 本 之 间 的 一 个 绑 定 , 这 样 在 通 道 变 得 可 读 或 可 写 的 时 候 求 这 个 脚 本 的 值 。 通 常 使 用 文 件 事 件 处 理 器 来 允 许 在 事 件 驱 动 的 基 础 上 从 另 一 个 进 程 接 收 数 据 , 这 样 接 受 者 可 以 在 等 待 数 据 到 来 的 时 候 继 续 与 用 户 交 互 。 如 果 一 个 应 用 在 一 个 阻 塞 (模 式 下 )的 通 道 上 调 用 getsread, 而 此 时 没 有 可 获 得 的 数 据 , 在 输 入 数 据 到 来 之 前 , 进 程 将 被 阻 塞 , 它 将 不 能 服 务 于 其 他 事 件 , 所 以 对 于 用 户 它 象 是 被 “冷 冻 ”了 。 使 用 fileevent, 进 程 可 以 在 数 据 出 现 (present)的 时 候 被 告 之 , 而 只 在 不 会 导 致 阻 塞 的 时 候 调 用 getsread 。 给 fileeventchannelId 参 数 参 照 一 个 打 开 的 通 道 , 比 如 从 以 前 的 opensocket 命 令 的 得 到 的 返 回 值 。 如 果 指 定 了 script 参 数 , 则 fileevent 建 立 一 个 新 的 事 件 处 理 器 : 在 通 道 变 得 可 读 或 可 写 (依 赖 于 给 fileevent 的 第 二 个 参 数 )的 时 候 求 script 的 值 。 在 这 种 情 况 下 fileevent 返 回 一 个 空 串 。 对 于 一 个 文 件 readablewritable事 件 处 理 器 是 独 立 的 , 可 以 单 独 的 建 立 和 删 除 。 但 是 , 在 一 个 特 定 的 解 释 器 中 在 一 个 特 定 的 时 间 上 对 于 一 个 文 件 最 多 只 能 有 一 个 readable和 一 个 writable 处 理 器 。 如 果 调 用 fileevent而 此 时 指 定 的 处 理 器 已 经 在 调 用 的 解 释 器 中 存 在 , 新 的 脚 本 替 换 旧 的 那 个 。 如 果 没 有 指 定 script 参 数 , fileeventchannelId返 回 当 前 的 脚 本 , 如 果 没 有 则 返 回 一 个 空 串 。 如 果 指 定 script 参 数 为 一 个 空 串 则 删 除 这 个 事 件 处 理 器 , 如 此 将 不 会 有 脚 本 被 调 用 。 在 一 个 通 道 被 关 闭 或 它 的 解 释 器 被 删 除 的 时 候 文 件 的 事 件 处 理 器 也 自 动 的 被 删 除 。 如 果 在 底 层 的 设 备 上 有 可 获 得 的 未 读 的 数 据 则 把 一 个 通 道 考 虑 为 可 读 的 。 除 了 要 从 这 个 通 道 读 的 最 近 的 尝 试 是 不 能 在 输 入 缓 冲 中 找 到 一 个 完 整 的 行 的 一 个 gets 调 用 的 特 殊 情 况 之 外 , 如 果 在 一 个 输 入 缓 冲 中 有 未 读 的 数 据 也 把 一 个 通 道 考 虑 未 可 读 的 。 这 个 特 征 允 许 使 用 事 件 从 一 个 在 非 阻 塞 模 式 下 的 文 件 中 一 次 读 一 行 。 如 果 在 底 层 的 文 件 或 设 备 上 有 文 件 结 束 或 出 错 的 条 件 出 现 也 把 一 个 通 道 考 虑 为 可 读 的 。 对 于 script 检 查 这 些 条 件 和 正 确 的 处 理 它 们 是 很 重 要 的 ; 例 如 , 如 果 没 有 对 文 件 结 束 的 特 定 检 查 , 可 能 发 生 一 个 无 限 的 循 环 , 这 里 script 读 不 到 数 据 , 返 回 , 立 即 重 新 调 用 。 如 果 至 少 数 据 中 有 一 字 节 可 以 写 到 底 层 文 件 或 设 备 中 而 不 阻 塞 , 或 者 在 底 层 的 文 件 或 设 备 上 有 错 误 的 条 件 出 现 则 把 一 个 通 道 考 虑 为 可 写 的 。 事 件 驱 动 I/O 最 好 为 使 用 fconfigure 命 令 配 置 成 非 阻 塞 模 式 的 通 道 工 作 。 在 阻 塞 模 式 下 , 如 果 你 给 它 的 数 据 比 底 层 文 件 或 数 据 可 接 受 的 多 , 则 puts 命 令 将 阻 塞 , 而 如 果 你 读 的 数 据 比 已 经 准 备 好 的 多 , 则 getsread 命 令 将 阻 塞 ; 在 命 令 阻 塞 时 不 处 理 事 件 。 在 非 阻 塞 模 式 下 , putsreadgets从 不 阻 塞 。 参 见 这 些 单 独 命 令 的 文 档 来 得 到 关 于 它 们 如 何 处 理 阻 塞 和 非 阻 塞 通 道 的 信 息 。 给 一 个 文 件 事 件 的 脚 本 在 调 用 fileevent 命 令 的 解 释 器 的 全 局 的 层 次 上 执 行 (在 任 何 Tcl 过 程 的 上 下 文 之 外 )。 如 果 在 执 行 脚 本 期 间 发 生 了 错 误 则 使 用 bgerror 机 制 来 报 告 错 误 。 额 外 的 , 如 果 一 个 事 件 处 理 器 曾 经 返 回 错 误 则 删 除 它 ; 目 的 是 防 止 缺 陷 很 多 的 处 理 器 导 致 无 限 循 环 。

感 谢 CREDITS

fileevent 基 于 由 Mark Diekhans 建 立 的 addinput 命 令 。

参 见 SEE ALSO

bgerror(n), fconfigure(n), gets(n), puts(n), read(n)

关 键 字 KEYWORDS

asynchronous I/O, blocking, channel, event handler, nonblocking, readable, script, writable.

[中 文 版 维 护 人 ]

寒 蝉 退 士

[中 文 版 最 新 更 新 ]

2001/08/13

《 中 国 Linux 论 坛 man 手 册 页 翻 译 计 划 》 :

http://cmpp.linuxforum.net

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh