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