【问题标题】:How to check if stdin buffer is empty at TCL?如何检查 TCL 的标准输入缓冲区是否为空?
【发布时间】:2012-02-03 17:28:37
【问题描述】:

使用fconfigure,您可以获取和设置频道选项。 -buffering 指定缓冲类型,默认为line 对应stdin

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


请看这个问题:How to check if stdin is pending in TCL?

【问题讨论】:

    标签: buffer tcl stdin


    【解决方案1】:

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

    另一个在阅读标准输入时有用的命令,如果你正在阅读交互式脚本命令,那就是使用 info complete 命令。有了这个,您可以累积行直到 info complete 返回 true,然后将整个缓冲区计算为一个。

    【讨论】:

    • 8.6 version of the same manpage 包含一个工作示例(对于套接字,但它们在事件处理方面并不是特别特殊)。
    • 另外,如果你使用info complete,你需要在每行的末尾放置/保留一个换行符,因为你累积它们包括刚刚读取的那个 .
    • 似乎fblocked stdin 适用于gets,但不适用于read stdin Number。在stdin -blocking false 模式下,read stdin BigNumber 的作用类似于gets,因此当剩余一些字符没有换行符时,它会返回空字符串。但是,在这种情况下,read stdin BigNumberfblocked stdin 的调用后返回 false。
    • @Vahagn:我怀疑在您的情况下 fblocked 返回 false 因为您已将通道设置为非阻塞模式。如果您考虑一下,这很明显。
    【解决方案2】:

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

    -buffering 选项仅影响输出通道;它在stdin(或任何其他只读通道)上没用,根本没有效果。真的。 (不过移除起来太麻烦了。)

    【讨论】:

    • 在我的工作示例中,chan pending input stdin 返回 0,而 fblocked stdin 返回 1。这是一个错误吗?
    • @Vahagn:不,那是正确的。如果没有输入,则通道被阻塞。所以fblocked 说它被阻止了,chan pending 说没有输入。对于阻塞通道,两者的含义相同。
    • 仅供参考,我只使用fblocked 与非阻塞通道。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2012-02-04
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多