2012-01-05 89 views

回答

2

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

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

+1

的[8.6版本相同的手册页的](http://www.tcl.tk/man/tcl8.6/TclCmd/fblocked.htm)包括工作实例(用于套接字,但它们对于事件处理并不特别重要)。 – 2012-01-05 22:27:27

+1

另外,如果你正在使用'info complete',你需要在读取每行结尾处放置/保留一个换行符,因为它们会累加它们,包括read_。 – 2012-01-05 22:29:08

+0

看来'fblocked stdin'对'gets'有效,但对'read stdin Number'不起作用。在'stdin -blocking false'模式下'读取stdin BigNumber'就像'gets',所以当有些字符没有换行符号时,它返回空字符串。但是,在这种情况下,在读取stdin BigNumber fblocked stdin后返回false。 – Vahagn 2012-01-05 23:42:21

0

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

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

+0

在我的工作示例中'chan pending input stdin'在'fblocked stdin'返回1时返回0。这是一个错误吗? – Vahagn 2012-01-05 23:06:29

+0

@Vahagn:没错。如果没有输入,则通道被阻塞。所以'fblocked'说它被阻塞,'chan pending'说没有输入。两者对于阻塞通道意味着同样的事情。 – slebetman 2012-01-06 08:19:49

+0

仅供参考,我只使用带有非阻塞通道的'fblocked'。 – 2012-01-06 16:02:21

0

我知道这是一个老问题,但它引发了一些关于我的结果的研究,并且我发现了一个叫做fileevent的函数,它在流(即stdin) ,有一些可以阅读的东西。这可能会有所帮助。

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