fileevent(3tcl)

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

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh