2013-07-17 22 views
4

This TIP困惑我。它似乎是說-buffering line使輸入緩衝區無限大,當我認爲行緩衝隻影響輸出的沖洗?我不能將-buffersize 5000-buffering line一起使用,以保護我免受發送排長隊的人員的影響?如果可以,那麼chan pending有什麼好處?發現緩衝區滿時沒有換行符?處理來自不可信套接字(和其他流)的DoS

還是有兩種不同的緩衝區?一種只是用於預讀數據以節省時間,另一種內部命令如getsread使用?

編輯:或者是僅當您使用gets,因爲它不返回部分行創建的問題? gets是否將流設置爲無限大的緩衝區模式,否則如果緩衝區沒有換行符填滿,get不能返回它?這是TIP談到的「線緩衝模式」嗎?

回答

2

首先,-buffersize選項爲輸出,未輸入。過去幾年我從來不需要設置它。 Tcl的緩衝區管理非常好。

其次,-buffering選項輸出。

第三,如果您使用阻止頻道,您很容易遭到有人向您發送很長的一行。除了等待行結束(或文件末尾)之外,您只有沒有機會做其他事情。

但是在非阻塞模式下,事情更加微妙。你可以得到一個頻道可讀的fileevent(與文件無關,但你可以更容易地檢查它們的大小是否理智,並且在任何情況下它們通常都不是問題)並執行gets $theChannel line,它返回-1。 (如果0或更多,你已經有了一條完整的線。)

那麼-1是什麼意思?那麼,這意味着要麼這條線不完整,要麼到達流的末尾。您可以將案例與fblocked/chan blocked(或eof檢測到相反的案例)區分開來,並且您發現該行尚未出現。現在怎麼辦?檢查有多少數據已用chan pending input緩衝;如果有一個愚蠢的數量(「傻」是可調諧的),那麼是時候放棄對該頻道的另一方不太好(即,只有close它)。

我還沒有看到chan pending output一個真正的使用與可寫fileevents不快樂,但它通常不是一個大問題:只用fcopy/chan copy從大數據源的數據槽向(慢速)輸出通道工作正常,沒有膨脹緩衝區很多。