【发布时间】:2012-02-03 17:28:37
【问题描述】:
【问题讨论】:
【问题讨论】:
显然,您可以将通道模式设置为非阻塞并从中读取。如果读取返回 0 长度,则没有可用的内容。但是,我怀疑您的意思是测试存在的数据,但不是完整的行,因为您提到了那里的行缓冲。 fblocked 命令为此测试通道。有关详细信息,请参阅fblocked(1),但对于行缓冲通道,这可以让您知道存在不完整的行。
另一个在阅读标准输入时有用的命令,如果你正在阅读交互式脚本命令,那就是使用 info complete 命令。有了这个,您可以累积行直到 info complete 返回 true,然后将整个缓冲区计算为一个。
【讨论】:
info complete,你需要在每行的末尾放置/保留一个换行符,因为你累积它们包括刚刚读取的那个 .
fblocked stdin 适用于gets,但不适用于read stdin Number。在stdin -blocking false 模式下,read stdin BigNumber 的作用类似于gets,因此当剩余一些字符没有换行符时,它会返回空字符串。但是,在这种情况下,read stdin BigNumberfblocked stdin 的调用后返回 false。
您可以使用chan pending input stdin 检查 Tcl 的输入 缓冲区(至少需要 Tcl 8.5)。但是,这并不表示操作系统的缓冲区中是否有任何内容;通过尝试读取数据(gets 或read)或通过使用触发可读fileevent的脚本来检查这些数据,当至少存在一个字节时。 (嗯,严格来说,实际承诺的是读取单个字节的尝试不会阻塞,但这可能是因为导致立即失败的错误条件。这就是操作系统级文件描述符准备工作的语义。)
-buffering 选项仅影响输出通道;它在stdin(或任何其他只读通道)上没用,根本没有效果。真的。 (不过移除起来太麻烦了。)
【讨论】:
chan pending input stdin 返回 0,而 fblocked stdin 返回 1。这是一个错误吗?
fblocked 说它被阻止了,chan pending 说没有输入。对于阻塞通道,两者的含义相同。
fblocked 与非阻塞通道。
我知道这是一个老问题,但它引发了我的一些研究,我发现了一个名为 fileevent 的函数,它在流(即标准输入)中有可以读取的内容时调用事件处理程序。这可能会有所帮助。
【讨论】: