2012-01-05 98 views

回答

2

很明顯,你可以在通道模式設置爲無阻塞並從中讀取。如果讀取返回0長度,則沒有任何可用的。然而,我懷疑你的意思是測試數據存在,但不是一個完整的行,因爲你提到了行緩衝。 fblocked命令爲此測試一個通道。有關詳細信息,請參閱fblocked(1),但對於線路緩衝通道,可以讓您知道存在不完整的線路。

閱讀stdin時,如果您正在閱讀交互式腳本命令,另一個有用的命令是使用info complete命令。有了這個,你可以積累行,直到信息完整返回true,然後評估整個緩衝區在一個。

+1

的[8.6版本相同的手冊頁的](http://www.tcl.tk/man/tcl8.6/TclCmd/fblocked.htm)包括工作實例(用於套接字,但它們對於事件處理並不特別重要)。 – 2012-01-05 22:27:27

+1

另外,如果你正在使用'info complete',你需要在讀取每行結尾處放置/保留一個換行符,因爲它們會累加它們,包括read_。 – 2012-01-05 22:29:08

+0

看來'fblocked stdin'對'gets'有效,但對'read stdin Number'不起作用。在'stdin -blocking false'模式下'讀取stdin BigNumber'就像'gets',所以當有些字符沒有換行符號時,它返回空字符串。但是,在這種情況下,在讀取stdin BigNumber fblocked stdin後返回false。 – Vahagn 2012-01-05 23:42:21

0

您可以檢查Tcl的輸入緩衝區chan pending input stdin(需要至少Tcl 8.5)。這並不表示操作系統是否在其緩衝區中有任何東西;通過使用從至少一個字節存在時可讀的fileevent觸發的腳本嘗試讀取數據(getsread來檢查這些數據。 (嗯,嚴格地說,實際上承諾的是,嘗試讀取單個字節不會被阻止,但可能是因爲導致立即失敗的錯誤情況,這就是操作系統級文件描述符準備工作的語義。)

-buffering選項僅影響輸出通道;它在stdin(或任何其他只讀通道)上沒有用處,並且完全沒有效果。真。 (但是,刪除太麻煩了。)

+0

在我的工作示例中'chan pending input stdin'在'fblocked stdin'返回1時返回0。這是一個錯誤嗎? – Vahagn 2012-01-05 23:06:29

+0

@Vahagn:沒錯。如果沒有輸入,則通道被阻塞。所以'fblocked'說它被阻塞,'chan pending'說沒有輸入。兩者對於阻塞通道意味着同樣的事情。 – slebetman 2012-01-06 08:19:49

+0

僅供參考,我只使用帶有非阻塞通道的'fblocked'。 – 2012-01-06 16:02:21

0

我知道這是一個老問題,但它引發了一些關於我的結果的研究,並且我發現了一個叫做fileevent的函數,它在流(即stdin) ,有一些可以閱讀的東西。這可能會有所幫助。

來源:http://wiki.tcl.tk/880