我从Tcl flush
命令得到了这个错误:
error flushing "stdout": I/O error
任何想法为什么会发生?此外,手册页没有说明flush
返回错误的任何内容。同一错误可能来自puts
吗?
最终:它做了什么呢?
谢谢。
答案 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
,但可以设置为full
或none
。设置为full
时,-buffersize
选项可用于显式控制缓冲区大小。