Tclflush
コマンドからこのエラーが発生しました:
error flushing "stdout": I/O error
なぜそれが起こり得るのか、何か考えはありますか?flush
また、manページには、エラーを返すことについては何も書かれていません。同じエラーが発生する可能性はありputs
ますか?そして最終的に:それについて何をしますか?
ありがとうございました。
Tclflush
コマンドからこのエラーが発生しました:
error flushing "stdout": I/O error
なぜそれが起こり得るのか、何か考えはありますか?flush
また、manページには、エラーを返すことについては何も書かれていません。同じエラーが発生する可能性はあり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
onに設定されていますが、またはstdout
に設定することもできます。に設定すると、このオプションを使用してバッファサイズを明示的に制御できます。full
none
full
-buffersize