想象一下进程间通信
+--------------+ +------------+
| 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
进程本身,在数据运行时应该读取什么... 不需要任何代码,只需要指向正确方向的指针,或者想要如何做到这一点,而不用填满我的内存或硬盘驱动器,所以最简单的方法:
monitoring
未运行时,它将填满我的硬盘。如果有人关心,$jref
是对json字符串的引用,那么我可以这样做:
use JSON::XS qw(decode_json):
my $perlref = decode_json($$jref);
答案 0 :(得分:3)
我的第一个想法是“UDP to localhost?”
该想法的变化包括AF_UNIX或命名管道。使用流套接字,你可以进行非阻塞连接,使用管道你可以进行O_WRONLY | O_NONBLOCK,如果你得到EAGAIN,只需返回而不写。
您可以保存文件句柄并在多个调用中重复使用,只需关闭它并在EPIPE
时重新打开即可。你希望$SIG{PIPE}='IGNORE';
希望黑匣子不反对。
阅读方面就像cat $path_to_fifo
或nc -l -u -p $udpport
一样简单,如果你使用AF_UNIX套接字会稍微困难一点。
答案 1 :(得分:2)
听起来使用套接字就足够了。选择端口号P
并尝试从主应用程序(localhost:P
)连接到监视器。如果端口已打开,则发送实际数据,而不是参考。如果端口关闭,则忽略数据。您的监视器将监听P
并处理通过此端口接收的任何数据。