根据需要与perl进行进程间通信

时间:2012-09-03 10:10:24

标签: perl architecture ipc

想象一下进程间通信

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

每隔2-5秒调用callback,正如我上面所说,此过程应该不间断。我无法改变BlackBox。

我需要:

  • 撰写processing of $jref部分 - 应该将$jref发送到某处的
  • monitoring进程本身,在数据运行时应该读取什么...

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

该想法的变化包括AF_UNIX或命名管道。使用流套接字,你可以进行非阻塞连接,使用管道你可以进行O_WRONLY | O_NONBLOCK,如果你得到EAGAIN,只需返回而不写。

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

阅读方面就像cat $path_to_fifonc -l -u -p $udpport一样简单,如果你使用AF_UNIX套接字会稍微困难一点。

答案 1 :(得分:2)

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