水泡に帰す……或いは振り出しに戻る

今日は一日、とあるプログラムに費やしました。が、結論から言うと、ぜーんぜん、動きませんでした。ダメでした、やり方がまるで。ということで、全然別の方法を考えなければならなくなってしまいました。トホホ。一日かけて、ダメなことを立証することになってしまいました。あぅぅ。

プログラムは、リアルタイムデータベースから、刻々と変化するデータを拾い出して、他のモジュールから使えるようにする……という perlのモジュールです。リアルタイムデータベースからデータを拾い出すモジュールは、社内で用意されたものがあるのでソレを利用する方針で、但し、こいつは、イベントドリブンなデザインで、ループをなしてしまうので、他のモジュールから利用するためには、ループを別のプロセスなりスレッドなりに分離しないといけないのです。そういう処理と、あとは、APIをカプセル化してモジュールにするという、TipicalなOOPです。

分離したループをなし、データを拾い続けるプロセスと、プログラム本体から呼び出されるAPI部とは、pipeを使って通信し、API側から要求があったことは、シグナルで通知するという方針でデザインを開始。つまり、

print $out $command, "\n";
kill USR1 => $pid;
my $result = <$in>;
のように、API側から、要求の送信と同時にシグナルを叩き込んでやるというわけです。これで、ループの中にいるプロセスは、シグナルハンドラに落ちてきて、要求を拾い出し、処理をし、それを返すという操作が出来るという算段です。個々の処理は、短い時間で済むものばかりなので、帰りはブロックリードで待ち受けます。

こうして、ガリガリとコードを書き上げて、いざ、テストを開始すると、プロセスの分離などはうまくいったものの、肝心の命令が伝わりません。そう、問題のループ……これは社内製のモジュールの中で作られているものなのですが、要するにこの人、シグナルを受け付けないように作ってくれてあるようでした、トホ。KILLなら通るんですが、それはハンドラで拾えないですから、使い物になりません。こんな基本的な話は、がりがりコードを書く前に調べておくべきでした。とほほ oTL