如何检查TCL上的stdin缓冲区是否为空?

时间:2012-01-05 21:32:51

标签: buffer tcl stdin

使用fconfigure,您可以获取并设置频道选项。 -buffering指定缓冲的类型,默认情况下linestdin

有没有办法检查stdin的缓冲区是否为空?


请参阅此问题:How to check if stdin is pending in TCL?

3 个答案:

答案 0 :(得分:2)

显然,你可以将频道模式设置为非阻塞并从中读取。如果读取返回0长度,则没有可用的内容。但是,我怀疑你的意思是测试存在的数据但不是完整的一行,因为你提到那里的线路缓冲。 fblocked命令为此测试通道。有关详细信息,请参阅fblocked(1),但对于行缓冲通道,这可以让您知道存在不完整的行。

读取stdin时的另一个有用命令,如果您正在阅读交互式脚本命令,则使用info complete命令。有了这个,您可以累积行,直到info complete返回true,然后将整个缓冲区评估为一个。

答案 1 :(得分:0)

您可以使用chan pending input stdin检查Tcl的输入缓冲区(至少需要Tcl 8.5)。这并不表示操作系统是否在其缓冲区中有任何内容;通过使用触发可读gets的脚本尝试读取数据(readfileevent进行检查,至少有一个字节存在。 (严格来说,实际上承诺的是读取单个字节的尝试不会阻塞,但可能是因为错误导致立即失败。这就是操作系统级文件描述符准备工作的语义。)

-buffering选项仅影响输出通道;它在stdin(或任何其他只读通道)上没用,并且完全没有效果。真。 (但是,移除它太麻烦了。)

答案 2 :(得分:0)

我知道这是一个老问题,但它引发了一些关于我的结果的研究,我发现了一个名为fileevent的函数,它在流(即stdin)中有一些可以读取的内容时调用事件处理程序。这可能会有所帮助。

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