fileevent -
チャンネルが読出し可能、あるいは書込可能になったらスクリプトを実行します。
fileevent channelId readable ? script?
fileevent channelId writable ? script?
本コマンドはファイルイベントハンドラを作成するために使われます。ファイルイベントハンドラとは、チャンネルが読出し可能か書込み可能になるたびにスクリプトが評価されるといったチャンネルとスクリプトの間の結び付きです。ファイルイベントハンドラは一般
的にイベント駆動ベースで他のプロセスからデータを受け取るために使われます。これによりレシーバはデータが到着するのを待つ間にもユーザとの対話を継続できます。アプリケーションはブロックモードのチャンネルに対してgets またはreadを呼び出した際、入力データが届いていなければ、プロセスはブロックします。入力データが到着するまで、他のイベントへのサービスができなくなり、ユーザから見ると"凍結状態"にあります。
fileeventによりプロセスはデータが存在するタイミングを知ることができるので、ブロックしていないときだけgetsや readを呼び出すことができます。
fileeventへのchannelId引数はTcl標準のチャネル (stdin、stdoutまたはstderr)
のようなオープンチャネルであり、以前にopenやscoketの呼出しからの戻り値、またはTcl拡張に提供されたチャネル作成コマンドの結果
値になります。
script 引数が指定されると、fileeventは新しいイベントハンドラを作成します。script
はチャンネルが読出し可能か書込み可能 (これはfileeventの2番目の引数に依存する)になるたびに評価されます。
この場合はfileeventは空文字列を返します。 1つのファイルに対する読出しが可能なで、書込み可能時のイベントハンドラが独立している時、ファイルに対して個別
に作成、削除することができます。しかしながら、あるインタプリタの特定の時点では一つのファイルに対して多くても1つの読込みハンドラと1つの書込みハンドラだけが存在しています。
fileeventが呼び出されると、呼び出す側のインタプ
リタに指定されたハンドラが既に存在する場合、新しいスクリプトは古いものに取って代わります。
script引数が指定されない場合、fileevent はchannelIdの現在のスクリプトを返し、または存在しない場合は空文字列を返します。
script 引数が空文字列として指定される場合、イベントハンドラは削除され、呼び出されるスクリプトはなくなります。ファイルイベントハンドラはチャンネルがクローズされた時点、及びインタプリタが削除されるたびに、自動的に削除されます。
バックグランドにあるデバイスにまだ読まれていないデータが存在する場合には、チャンネルは読出し可能と見なされます。
直近のチャンネルからの読出しの試みが、入力バッファの中で完全な行を見つけれれなかったgetsの呼出しのような特殊なケースを除いて、
入力バッファにまだ読まれていないデータが存在する場合も、チャネルは読出し可能と見なされます。
この特徴はイベントを使って非ブロックモードで一度に一行づつファイルを読込むことを可能にしています。
バックグランドにあるファイルやデバイスがファイルの終わりやエラー状態にあるときも、チャネルは読出し可能と見なされます。
これらの状態をチェックし、適切に扱うことはscriptにとって重要なことです。例えば、ファイル終了の特別
チェックがなければ、scriptがデータを読込めずに制御を戻し、直ちに再び呼び出される、という無限ループが起こる恐れがあります。
対象となるファイルやデバイスで少なくても1バイトのデータがブロックされることなく書込みできる場合、及び対象となるファイルやデバイスがエラー状態にある場合には、チャンネルは書込み可能だと見なされます。
イベント駆動のI/Oはfconfigureコマンドにより、非ブロックモー
ドに置かれているチャンネルで最もうまく動作します。ブロックモードでは、putsコマンドは対象となるファイルやデバイスが許容できる容量
より多くのデータを与えられるとブロックします。また、 getsや readコマンドは準備されているデータより多くを読もうと試みるとブロックします。コマンドがブロックされている間はいかなるイベントも処理されません。非ブロックモードではputs、 readそしてgetsは決してブロックしません。ブロック、非ブロックチャンネルがどのように扱われるかについての情報は、個々のコマンドのドキュメントを参照してください。
ファイルイベントのためのスクリプトはfileeventコマンドが呼び出されたインタプリタにおけるグローバルレベル(あらゆるTclプロシージャの文脈の外側で)で実行されます。スクリプトの実行中にエラーが発生する場合、bgerrorメカニズムでエラーを報告します。更に、エラーを返すと、ファイルイベントハンドラは削除されます。これはバグを含むハンドラによる無限ループを防ぐためです。
proc GetData {chan} {
if {![eof $chan]} {
puts [gets $chan]
}
}
fileevent $chan readable [list GetData $chan]
この設定において、$chanが読出し可能になるたびに、GetDataはチャネルを引数として呼出されます。
fileevent は Mark Diekhans によって作成されたaddinputコマンドに基づくものです。
bgerror, fconfigure, gets, puts, read,
Tcl_StandardChannels
キーワード
asynchronous I/O, blocking, channel,
event handler, nonblocking, readable,
script, writable.
Copyright © 1994 The Regents of the University of California.
Copyright © 1994-1996 Sun Microsystems, Inc.
Copyright © 1995-1997 Roger E. Critchlow Jr.
|