4

这个 TIP让我很困惑。似乎是说-buffering line输入缓冲区无限大,当我认为行缓冲只影响输出的刷新时?我不能-buffersize 5000和 with 一起使用-buffering line来保护我免受发送长线的人的伤害吗?如果可以,那有什么好处chan pending?要发现缓冲区何时已满而没有换行符?

还是有两个不同的缓冲区?一个只是用于预读数据以节省时间,另一个是内部命令喜欢getsread使用的?

编辑:还是仅在您使用时才产生问题,gets因为它不返回部分行?是否gets将流置于无限大缓冲区模式,否则如果缓冲区填满而没有换行符,gets 将永远无法返回它?这就是 TIP 所说的“行缓冲模式”吗?

4

1 回答 1

2

首先,该-buffersize选项用于输出,而不是输入。在过去的几年里,我从来不需要设置它;Tcl 的缓冲区管理非常好。

其次,该-buffering选项用于输出。

第三,如果您使用阻塞通道,您很容易受到有人向您发送很长的线路的攻击。除了等待行尾(或文件结尾)到来之外,您没有机会做任何事情。

但是在非阻塞模式下,事情就更加微妙了。你会得到一个可读fileevent的通道(与文件无关,但你可以更容易地检查它们的大小是否正常,在任何情况下它们通常都不是问题)并执行 a gets $theChannel line,它返回 -1。(如果为 0 或更多,则您有一个完整的行。)

那么-1是什么意思呢?好吧,这意味着要么这条线不完整,要么你已经到了流的末尾。您可以用fblocked/区分情况chan blocked(或eof检测相反的情况),您会发现该行还不存在。现在怎么办?检查缓冲了多少数据chan pending input;如果有一个愚蠢的数量(其中“愚蠢”是可调的),那么是时候放弃频道了,因为另一边并不好(即,只是close它)。

我还没有看到真正的用途,chan pending output因为它对可写文件事件并不满意,但这通常不是一个大问题:仅使用fcopy/chan copy将来自大型源的数据假脱机到(慢速)输出通道就可以正常工作,而不会大量膨胀缓冲区.

于 2013-07-17T22:33:15.997 回答