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();

callback每 2-5 秒调用一次,正如我上面所说,这个过程应该不间断运行。我无法更改黑匣子。

我需要:

  • processing of $jref部分 - 什么应该发送$jref某个地方
  • 以及monitoring进程本身,应该读取数据的内容,运行时...

不需要任何代码,只需要一些指向正确方向的指针,或者知道如何做到这一点,而不会填满我的内存或硬盘,所以最简单的方法:

  • 将 $jref 写入文件是不合适monitoring的,因为它会在未运行时填满我的硬盘。

如果有人关心,那$jref是对 json 字符串的引用,所以我可以这样做:

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

2 回答 2

3

我的第一个想法是“UDP 到 localhost?”

该想法的变体包括 AF_UNIX 或命名管道。使用流套接字,您将执行非阻塞连接,使用管道,您将执行 O_WRONLY|O_NONBLOCK,如果您获得 EAGAIN,则无需写入即可返回。

您可以保存文件句柄并在多个调用中重复使用它,只需关闭它并在获得EPIPE. 你会$SIG{PIPE}='IGNORE';希望黑匣子不会反对。

cat $path_to_fifo阅读方面与or一样简单nc -l -u -p $udpport,如果您使用 AF_UNIX 套接字,则稍微困难一些。

于 2012-09-03T10:28:20.583 回答
2

听起来使用套接字就足够了。选择一个端口号P并尝试从主应用程序 ( localhost:P) 连接到监视器。如果端口打开,则发送实际数据,而不是参考。如果端口关闭,则忽略数据。您的监视器将侦听P并处理通过此端口接收到的任何数据。

于 2012-09-03T10:28:03.537 回答