使用fconfigure
您可以獲取並設置頻道選項。 -buffering
指定緩衝的類型,默認情況下爲,用於stdin
。如何檢查TCL中stdin緩衝區是否爲空?
有沒有辦法檢查stdin
的緩衝區是否爲空?
請參閱此問題:How to check if stdin is pending in TCL?
使用fconfigure
您可以獲取並設置頻道選項。 -buffering
指定緩衝的類型,默認情況下爲,用於stdin
。如何檢查TCL中stdin緩衝區是否爲空?
有沒有辦法檢查stdin
的緩衝區是否爲空?
請參閱此問題:How to check if stdin is pending in TCL?
很明顯,你可以在通道模式設置爲無阻塞並從中讀取。如果讀取返回0長度,則沒有任何可用的。然而,我懷疑你的意思是測試數據存在,但不是一個完整的行,因爲你提到了行緩衝。 fblocked命令爲此測試一個通道。有關詳細信息,請參閱fblocked(1),但對於線路緩衝通道,可以讓您知道存在不完整的線路。
閱讀stdin時,如果您正在閱讀交互式腳本命令,另一個有用的命令是使用info complete命令。有了這個,你可以積累行,直到信息完整返回true,然後評估整個緩衝區在一個。
您可以檢查Tcl的輸入緩衝區與chan pending input stdin
(需要至少Tcl 8.5)。這並不表示操作系統是否在其緩衝區中有任何東西;通過使用從至少一個字節存在時可讀的fileevent
觸發的腳本嘗試讀取數據(gets
或read
)或來檢查這些數據。 (嗯,嚴格地說,實際上承諾的是,嘗試讀取單個字節不會被阻止,但可能是因爲導致立即失敗的錯誤情況,這就是操作系統級文件描述符準備工作的語義。)
-buffering
選項僅影響輸出通道;它在stdin
(或任何其他只讀通道)上沒有用處,並且完全沒有效果。真。 (但是,刪除太麻煩了。)
我知道這是一個老問題,但它引發了一些關於我的結果的研究,並且我發現了一個叫做fileevent
的函數,它在流(即stdin) ,有一些可以閱讀的東西。這可能會有所幫助。
的[8.6版本相同的手冊頁的](http://www.tcl.tk/man/tcl8.6/TclCmd/fblocked.htm)包括工作實例(用於套接字,但它們對於事件處理並不特別重要)。 – 2012-01-05 22:27:27
另外,如果你正在使用'info complete',你需要在讀取每行結尾處放置/保留一個換行符,因爲它們會累加它們,包括read_。 – 2012-01-05 22:29:08
看來'fblocked stdin'對'gets'有效,但對'read stdin Number'不起作用。在'stdin -blocking false'模式下'讀取stdin BigNumber'就像'gets',所以當有些字符沒有換行符號時,它返回空字符串。但是,在這種情況下,在讀取stdin BigNumber fblocked stdin後返回false。 – Vahagn 2012-01-05 23:42:21