2013-04-20 20 views
1

我需要在輸入通道關閉後執行一些操作。男人fileevent說:無論何時,只要通道被關閉tcl:如何處理通過文件事件讀取的通道關閉

所以,如果一個通道被關閉,該處理器可能不會被調用來處理這個

的文件事件處理程序也被自動刪除。當我嘗試讀取子進程的輸出時,我可以真正看到它:以前的處理程序調用仍然將[eof $ fd]視爲false,而下一個調用從不調用。

我現在可以想象的唯一方法就是執行一些像定期看門狗這樣的黑客行爲,檢查$ fd是否仍然打開,但這非常髒。我可以肯定,當其他閱讀頻道打開時,$ fd不會得到相同的值嗎?

+0

答案在這裏:http://wiki.tcl.tk/fileevent? (一定要點擊「顯示討論」) – 2013-04-21 13:37:36

回答

2

我想這裏需要一些說明。當文檔顯示「頻道已關閉」時,則表示「頻道已關閉」。換句話說,直到調用[close]

如果通道從另一端關閉(例如,插座的另一端或管道的另一端),則在您自己撥打電話[close]之前,它不會被視爲關閉。因此,如果通道在另一端關閉,fileevent將被執行,並且[eof]將返回true(否則讀操作將會出錯)。

我從來沒有遇到過tcl檢測到通道已關閉但未調用fileevent的情況。我不認爲這是可能的。但是,在某些情況下,通道實際上已經死亡但未關閉(通常是由於網絡錯誤或另一端的計算機重新啓動)。對於這種情況你需要實現超時。但暫停並不意味着該頻道已關閉。這意味着您不再相信渠道另一端的機器仍然活着。

+0

+1:檢測封閉的網絡渠道是不平凡的;如果網絡進入「吞食所有數據包」模式,您將無法可靠地檢測到這一事實(並且與任意長的延遲無法區分)。這與本地物理層的丟失是不同的,在這裏檢測是可能的(當然,如果不總是微不足道的話)。 – 2013-04-22 09:13:02