2

プロセス間通信を想像してください

+--------------+                               +------------+
| main_process | ==produces data somewhat to=> | monitoring |
+--------------+                               +------------+

どこ:

  • ノンストップで実行main_processされており、monitoring
  • monitoring時々しか実行されず、実行中はによって生成されたデータを読み取る必要がありますmain_process
  • が実行されていない場合、monitoringによって生成されたデータmain_processは保存されません。

問題は、「オンデマンド」IPC のように記述する方法です。

のコードmain_processは基本的に次のとおりです (実際のコードはもっと複雑です)。

use 5.014;
use warnings;
my $box = new BlackBox( callback =>  sub {
    my ($self, $jref) = @_;
    #
    # processing of $jref
    #
});
$box->run();

callback2 ~ 5 秒ごとに呼び出され、上記で説明したように、このプロセスはノンストップで実行される必要があります。BlackBox を変更できません。

私は欲しい:

  • 部分を書く-どこかprocessing of $jrefに送る$jrefもの
  • monitoringプロセス自体、実行時にデータを読み取る必要があるもの...

コードは必要ありません。メモリや HDD をいっぱいにすることなく、正しい方向へのポインタが必要なだけです。または、これを行う方法を考えてください。最も簡単な方法は次のとおりです。

  • が実行されていないときに HDD がいっぱいになるため、$jref をファイルに書き込むのは適切monitoringではありません。

誰かが気になる場合$jrefは、json文字列への参照であるため、次のことができます。

 use JSON::XS qw(decode_json):
 my $perlref = decode_json($$jref);
4

2 に答える 2

3

私の最初の考えは「UDPからローカルホストへ?」でした。

そのアイデアのバリエーションには、AF_UNIXまたは名前付きパイプが含まれます。ストリームソケットを使用すると、ノンブロッキング接続を実行し、パイプを使用すると、O_WRONLY | O_NONBLOCKを実行し、EAGAINを取得した場合は、書き込みを行わずに戻ります。

ファイルハンドルを保存して複数の呼び出しで再利用できます。ファイルを閉じて、を取得したら再度開きますEPIPE$SIG{PIPE}='IGNORE';ブラックボックスがそれに反対しないことを願っています。

読み取り側はまたはと同じくらい単純cat $path_to_fifoですnc -l -u -p $udpportが、AF_UNIXソケットを使用する場合は少し難しくなります。

于 2012-09-03T10:28:20.583 に答える
2

ソケットを使うだけで十分なようです。ポート番号Pを選択し、メインアプリケーションからモニターに接続してみてください(localhost:P)。ポートが開いている場合は、参照ではなく実際のデータを送信します。ポートが閉じている場合は、データを無視してください。モニターはP、このポートを介して受信したすべてのデータをリッスンして処理します。

于 2012-09-03T10:28:03.537 に答える