Kデスクトップ環境

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

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

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

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

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

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

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

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にあります)。