使用 perl 的按需进程间通信

Posted

技术标签:

【中文标题】使用 perl 的按需进程间通信【英文标题】:On demand inter-process communication with perl 【发布时间】:2012-09-03 10:10:23 【问题描述】:

想象一下进程间通信

+--------------+                               +------------+
| 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 秒被调用一次,正如我上面所说的,这个过程应该不间断地运行。我无法更改 BlackBox。

我需要:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

您可以保存您的文件句柄并在多次调用中重复使用它,如果您收到EPIPE,只需将其关闭并重新打开。你会想要$SIGPIPE='IGNORE'; 希望黑匣子不会反对。

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

【讨论】:

根据您(和@perreal)的建议,我刚刚找到了search.cpan.org/~robins/Log-UDP-Client-0.20.0/lib/Log/UDP/… 和search.cpan.org/~robins/Log-UDP-Server-0.40.0/lib/Log/UDP/…,这给了我一个非常简单的解决方案。谢谢你。因为 "UDP" 接受这个。 ;)【参考方案2】:

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

【讨论】:

以上是关于使用 perl 的按需进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

简单的进程间通信

Perl进程间数据共享

1-4_基本概念_进程间通信及同步

Linux系统编程--进程间通信 ---管道篇

VC++ 进程间的通信

Linux进程间通信