3

Tclflushコマンドからこのエラーが発生しました:

error flushing "stdout": I/O error

なぜそれが起こり得るのか、何か考えはありますか?flushまた、manページには、エラーを返すことについては何も書かれていません。同じエラーが発生する可能性はあり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 configure8.5以降)を使用して制御できます。-buffering通常はlineonに設定されていますが、またはstdoutに設定することもできます。に設定すると、このオプションを使用してバッファサイズを明示的に制御できます。fullnonefull-buffersize

于 2012-11-05T23:27:43.277 に答える