2012-01-05 39 views

答えて

2

明らかにあなたは非ブロックにチャネルモードを設定し、それから読み取ることができます。読取り値が0の場合、使用可能なものはありません。しかし、私はあなたがそこにバッファリングしている行のあなたの言及を与えられた完全な行ではなく、存在するデータをテストすることを意味すると思う。 fblockedコマンドは、このためにチャネルをテストします。詳細については、fblocked(1)を参照してください。しかし、ラインバッファリングされたチャンネルの場合、不完全なラインが存在することがわかります。

対話型スクリプトコマンドを読み込んでいる場合は、stdinを読むときに便利なもう1つのコマンドは、info completeコマンドを使用することです。これにより、info completeがtrueを返し、バッファ全体を1つに評価するまで、行を蓄積することができます。

+1

[同じマンページの8.6バージョン(http://www.tcl.tk/man/tcl8.6/TclCmd/fblocked.htm)がソケットのために働いた例(含みます、特別なイベント処理ではありません)。 –

+1

また、 'info complete'を使用している場合は、読み込まれたばかりの行を含めて、各行の最後に改行を置いておく必要があります。 –

+0

'fblocked stdin'は' gets'で動作しますが、 'read stdin Number'では動作しません。 'stdin -blocking false'モードで' read stdin BigNumber'は 'gets'のように動作するので、改行記号が残っていない文字があると空の文字列を返します。しかし、この場合、 'read stdin BigNumber'の呼び出しの後、' fblocked stdin'はfalseを返します。 – Vahagn

0

Tclの入力バッファchan pending input stdin(少なくともTcl 8.5以上必要)で確認できます。これは、OSにバッファに何かがあるかどうかを示すものではありません。それらは、少なくとも1バイトが存在するときに読み取り可能なfileeventをトリガーするスクリプトを使用してデータ(getsまたはreadまたはを読み取ろうとすることによってチェックされます。実際に約束されているのは、1バイトの読み込みがブロックされないということですが、すぐにエラーが発生するエラー状態が原因である可能性があります。これは、OSレベルのファイルディスクリプタの準備がどのように機能するかのセマンティクスです。

-bufferingオプションは出力チャネルにのみ影響します。 stdin(または他の読み取り専用チャンネル)では役に立たず、まったく効果がありません。本当に。

+0

私の動作例では、 'chan pending input stdin'は' fblocked stdin'が1を返すときに0を返します。これはバグですか? – Vahagn

+0

@Vahagn:いいえ、それは正しいです。入力がない場合、チャンネルはブロックされます。だから 'fblocked'はブロックされ、' chan pending'は入力がないと言っています。両方とも、ブロッキングチャネルに対して同じことを意味します。 – slebetman

+0

参考までに、私は非ブロックチャンネルで 'fblocked'を使用するだけです。 –

0

私はこれが古い質問だと知っていましたが、私の最後の研究が始まりました。fileeventという名前の関数が見つかったので、ストリーム、すなわちstdinそれには読めるものがあります。それは役に立つかもしれません。

出典:http://wiki.tcl.tk/880

関連する問題