我从 Tclflush
命令中得到了这个错误:
error flushing "stdout": I/O error
任何想法为什么会发生?此外,手册页没有说明flush
返回错误。会出现同样的错误puts
吗?最终:该怎么办?
谢谢你。
我从 Tclflush
命令中得到了这个错误:
error flushing "stdout": I/O error
任何想法为什么会发生?此外,手册页没有说明flush
返回错误。会出现同样的错误puts
吗?最终:该怎么办?
谢谢你。
默认情况下,Tcl 使用行缓冲stdout
(稍后会详细介绍)。这意味着您puts
那里的任何内容都会被缓冲,并且仅当在缓冲区中看到换行符或当您flush
进入频道时才会输出。puts
所以,是的,如果对它的调用是在无缓冲通道上完成的,或者如果它设法达到“缓冲区已满”条件以便真正访问底层介质,则可以直接得到相同的错误。
至于“I/O 错误”,我们确实需要更多细节。假设stdout
您的程序的 已被重定向(或重新打开),并且由于某种原因无法访问底层媒体。
您可以尝试通过检查实际失败的系统调用的原因来推断有关原因的更多详细信息——在涉及此类系统调用信号错误条件的 Tcl 命令之后,POSIX
errno
可以通过全局errorCode
变量访问它。所以你可以这样:
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
从 8.5 开始)通过操作其-buffering
选项在通道上控制输出缓冲。通常设置为line
onstdout
但也可以设置为full
或none
。当设置为 时full
,该-buffersize
选项可用于显式控制缓冲区大小。