flush channelId
我们怎么知道通道被阻止了?
谁能解释一下我们什么时候可以在 TCL 中使用 flush
命令?
flush
命令指示 Tcl 确保其通道的所有缓冲输出立即写入底层操作系统。您几乎不需要显式使用flush
;主要的例外是当您在不使用新行的情况下提示用户输入时:
puts -nonewline "Please enter your name: "
flush stdout
set name [gets stdin]
但是,如果由于其他原因导致刷新问题,则实际上需要使用fconfigure
来更改默认输出缓冲区管理策略:
# Turn off output buffering
fconfigure $channel -buffering none
每个通道支持三种缓冲策略:
-
none
— 完全没有缓冲。 -
full
— 缓冲区,直到建立完整的输出缓冲区(输出缓冲区大小是可控的,但您几乎不需要触摸它(,然后一次写入整个缓冲区。 -
line
— 缓冲,直到可以一次写入一整行输出。
大多数通道默认为 full
,因为这在写入批量数据时提供最佳性能,但stdout
通道在写入终端时默认为 line
,stderr
通道始终默认为 none
(因为它用于在系统非常糟糕并且可能崩溃时写入消息, 除其他外(。