3

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

error flushing "stdout": I/O error

任何想法为什么会发生?此外,手册页没有说明flush返回错误。会出现同样的错误puts吗?最终:该怎么办?

谢谢你。

4

1 回答 1

4

默认情况下,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选项在通道上控制输出缓冲。通常设置为lineonstdout但也可以设置为fullnone。当设置为 时full,该-buffersize选项可用于显式控制缓冲区大小。

于 2012-11-05T23:27:43.277 回答