KSirc ハンドブック
前のページ | 第 5章Sirc クライアントプログラミング | 次のページ

# 5.6. メインselect()ループにファイルハンドルを追加する

sirc 2.2のように、スクリプトはメインループにファイルハンドルを追加することができ、データが有効な場合コントロールするよう、それらにフックを設定することができます。

最初にファイルハンドルを開くかはスクリプト次第です。それは、ネットワーク接続、tty、パイプ (`open(FH, "program |")`にあるような)などを参照します。

ネットワークソケットを扱うと、perlの機能を使うよりもsircにより提供されるAPI(`&connect, &listen, &accept, &resolve, &newfh`や`$bindaddr`)を使用するこ とを強くお勧めします。これは、sockモジュールがロードされて、このスクリプトがsockプロキシ越に透過的稼働を行わせるる効果があります。ある特別な機能性(UDPソケット、または同リスニングソケットから多数接続を受け入れるような)を必要とする場合は、 perl自体の機能を利用することもできます。

ファイルハンドル上でデータが有効な場合コントロールを取り戻すには、 次のものから、またはそれを用いてfhのsirc`select()s`にファイルハンドルを追加します。

`&addsel($fh, "somename", flag);`。そこでsel_somenameは、何か読み込むものがあるとコントロールを取り戻すサブで、sircに接続を緩衝させ、ラインに押し入れるとフラグは1で、sircにはデータには触れて欲し くない場合、フラグは0になります。

`sel_somename`サブの規則は、2つの点で違いがあります。

- 緩衝されたファイルハンドルについては、読み込まれた行を含むシングル引数が渡されます。文末には、`\n`が含まれます。接続が閉じられたり、切断された場合、この引数は`''`で、ファイルハンドルは既に閉じられ、fhの設定から`select()`まで削除されています。自分自身で閉じる場合、sircに設定からそれを削除するように伝えるため`&remsel`を使わなければなりません。

- 緩衝されていないファイルハンドルについては、いかなる引数も渡されません。`select()`によって、fhが読み込み準備ができていると暗示されると、フックがコールされ、そこからの読みとりはフック次第です。(ブロックしていないことを確認して下さい。<>ではなくsysreadが使われるべきでしょう。)結局それを閉じ、`&remsel`を使って削除するのもフックによります。

`select()ed`上のfhの設定からファイルハンドルを削除するには、`$fh`がファイルハンドルになっている`&remsel($fh);`をコールします。

sircは、そこに与えるファイルハンドルが正当であるかどうかを全くチェックしない点に注意して下さい。`select()able`の設定で、閉じられたもしくは不正な`fh`が存在したり、緩衝されていない`sel_ ;* hook`上のデータを実際に読み込まないと、`select()`でブロックを防ぐことで、sircによるCPUの使用率が多くなるでしょう。

このおおざっぱな使用例用に、ftp.plスクリプトをご覧ください。これはsirc内でftpクライアントを実装しています。(sircウェブページhttp://www.eleves.ens.fr:8080/home/espel/sirc/sirc.htmlにあります)。

前のページ | Home | 次のページ
タイマー | Up | ボット