Tcl flush命令返回错误

时间:2012-11-05 22:31:45

标签: tcl

我从Tcl flush命令得到了这个错误:

error flushing "stdout": I/O error

任何想法为什么会发生?此外,手册页没有说明flush返回错误的任何内容。同一错误可能来自puts吗? 最终:它做了什么呢?

谢谢。

1 个答案:

答案 0 :(得分:4)

默认情况下,Tcl在stdout上使用行缓冲(稍后会详细介绍)。这意味着无论你puts得到什么缓冲,只有在缓冲区中看到换行符或flush通道时才会输出。所以,是的,你可以直接从puts获得相同的错误,如果在无缓冲的通道上完成对它的调用,或者它设法达到“缓冲区已满”状态,以便真正访问基础媒体。

关于“I / O错误”,我们确实需要更多细节。据推测,您的程序的stdout已被重定向(或reopened),并且基础媒体由于某种原因无法访问。

您可以尝试通过检查实际失败的系统调用的POSIX errno来推断有关原因的更多详细信息 - 在涉及此类系统调用信号错误情况的Tcl命令之后,可以通过全局errorCode variable访问它。所以你可以这样:

set rc [catch {flush stdout} err]
if {$rc != 0} {
    global errorCode
    set fd [open error.log w]
    puts $fd $err\n\n$errorCode
    close $fd
}

(从Tcl 8.5开始,您可以直接要求catch返回所有相关信息,而不是检查魔术变量,请参阅手册。

强烈建议您提供有关如何运行程序或是否重新打开stdout的详细信息。


关于缓冲的说明。通过操作其fconfigure选项,可以使用通道上的chan configure(或-buffering自8.5以后)控制输出缓冲。通常它在line上设置为stdout,但可以设置为fullnone。设置为full时,-buffersize选项可用于显式控制缓冲区大小。

相关问题