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