Provided by: manpages-zh_1.5.2-1.1_all
NAME
fileevent - 在一個通道變得可讀或可寫的時候執行一個稿本
總覽 SYNOPSIS
fileevent channelId readable ?script? fileevent channelId writable ?script? _________________________________________________________________
描述 DESCRIPTION
這個命令被用於建立檔案事件處理器。一個檔案事件處理器(handler)是在一個通道和一個稿本之間的 一個綁定,這樣在通道變得可讀或可寫的時候求這個稿本的值。通常使用檔案事件處理器來允許在事件 驅動的基礎上從另一個進程接收數據,這樣接受者可以在等待數據到來的時候繼續與使用者交互。如果 一個應用在一個阻塞(模式下)的通道上調用 gets或 read,而此時沒有可獲得的數據,在輸入數據到來 之前,進程將被阻塞,它將不能服務於其他事件,所以對於使用者它像是被「冷凍」了。使用 fileevent,進程可以在數據出現(present)的時候被告之,而只在不會導致阻塞的時候調用 gets或 read 。 給 fileevent的 channelId 參數參照一個打開的通道,比如從以前的 open 或 socket 命令的得到 的返回值。如果指定了 script 參數,則 fileevent 建立一個新的事件處理器: 在通道變得可讀或 可寫(依賴於給 fileevent 的第二個參數)的時候求 script 的值。在這種情況下 fileevent 返回一 個空串。對於一個檔案 readable 和 writable事件處理器是獨立的,可以單獨的建立和刪除。但 是,在一個特定的解釋器中在一個特定的時間上對於一個檔案最多只能有一個readable和一個 writable 處理器。如果調用 fileevent而此時指定的處理器已經在調用的解釋器中存在,新的稿本替 換舊的那個。 如果沒有指定 script 參數,fileevent 為 channelId返回當前的稿本,如果沒有則返回一個空 串。如果 指定 script 參數為一個空串則刪除這個事件處理器,如此將不會有稿本被調用。在一個通 道被關閉或它的解釋器被刪除的時候檔案的事件處理器也自動的被刪除。 如果在底層的設備上有可獲得的未讀的數據則把一個通道考慮為可讀的。除了要從這個通道讀的最近的 嘗試是不能在輸入緩沖中找到一個完整的行的一個 gets 調用的特殊情況之外,如果在一個輸入緩沖 中有未讀的數據也把一個通道考慮未可讀的。這個特征允許使用事件從一個在非阻塞模式下的檔案中一 次讀一行。如果在底層的檔案或設備上有檔案結束或出錯的條件出現也把一個通道考慮為可讀的。對於 script 檢查這些條件和正確的處理它們是很重要的;例如,如果沒有對檔案結束的特定檢查,可能發 生一個無限的循環,這裏script 讀不到數據,返回,立即重新調用。 如果至少數據中有一字節可以寫到底層檔案或設備中而不阻塞,或者在底層的檔案或設備上有錯誤的條 件出現則把一個通道考慮為可寫的。 事件驅動 I/O 最好為使用 fconfigure 命令配置成非阻塞模式的通道工作。在阻塞模式下,如果你給 它的數據比底層檔案或數據可接受的多,則 puts 命令將阻塞,而如果你讀的數據比已經準備好的 多,則gets 或 read 命令將阻塞;在命令阻塞時不處理事件。在非阻塞模式下,puts、read和 gets從 不阻塞。參見這些單獨命令的文件來得到關於它們如何處理阻塞和非阻塞通道的信息。 給一個檔案事件的稿本在調用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