Tcl flush命令返回错误

Tcl flush命令返回错误,tcl,Tcl,我从Tclflush命令中得到了这个错误: error flushing "stdout": I/O error 你知道为什么会这样吗?此外,手册页没有说明任何关于flush返回错误的内容。同样的错误会来自于puts? 最后:我们该怎么办 谢谢。默认情况下,Tcl在stdout上使用行缓冲(稍后将对此进行详细介绍)。这意味着无论您将什么放在那里,都会被缓冲,并且只有当在缓冲区中看到换行符或当您刷新通道时才会输出。因此,是的,如果对它的调用是在无缓冲通道上完成的,或者如果它设法达到“缓冲区已满”

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

error flushing "stdout": I/O error
你知道为什么会这样吗?此外,手册页没有说明任何关于
flush
返回错误的内容。同样的错误会来自于
puts
? 最后:我们该怎么办


谢谢。

默认情况下,Tcl在
stdout
上使用行缓冲(稍后将对此进行详细介绍)。这意味着无论您将什么
放在那里,都会被缓冲,并且只有当在缓冲区中看到换行符或当您
刷新通道时才会输出。因此,是的,如果对它的调用是在无缓冲通道上完成的,或者如果它设法达到“缓冲区已满”的条件,从而真正访问了底层介质,那么您可以直接从
put
获得相同的错误

至于“I/O错误”,我们确实需要更多的细节。假定程序的
stdout
已被重定向(或),并且由于某种原因无法访问底层媒体

您可以通过检查实际失败的系统调用的状态来尝试推断有关原因的更多详细信息—在涉及此类系统调用发出错误信号的Tcl命令之后,可以通过全局命令来访问。所以你可以这样说:

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
返回所有相关信息,而不是检查神奇变量,请参阅手册)

强烈建议提供有关如何运行程序或是否重新打开标准输出的更多详细信息



关于缓冲的注释。通过操纵通道上的
-buffering
选项,可以使用通道上的
fconfigure
(或
chan configure
)控制输出缓冲。通常在标准输出上设置为
line
,但也可以设置为
full
none
。当设置为
full
时,
-buffersize
选项可用于显式控制缓冲区大小。

POSIX错误代码不会说太多;该消息意味着
write()
syscall中出现了
EIO
错误,这不是一个非常有用的错误。