我需要从c程序向Perl程序发送一些数据,这些数据都处于运行模式(睡眠模式下的Perl程序和c程序运行,c程序将数据发送到Perl)。
我知道,可以通过套接字和共享内存编写这个程序但是我有性能问题。我认为共享内存是更好的解决方案,我怎样才能发信号通知Perl程序唤醒并恢复运行并读取发送的数据?
答案 0 :(得分:7)
您似乎有两个问题:
假设您所在的系统允许进行SysV IPC调用,您可以使用IPC::ShareLite在两个进程之间共享一块内存。
与共享内存一样,您必须确保锁定到位。 IPC :: ShareLite的模块手册页似乎很好地解释了复杂性和方法调用。
关于Perl程序的信号,有新数据可用,没有什么能阻止你使用...信号来实现这一点!您的C程序可以将SIGUSR1发送到Perl程序,Perl程序将访问共享内存并在接收信号时执行操作,否则将睡眠。
请看perldoc perlipc,但其中的要点是这样的:
use strict;
use warnings;
use IPC::ShareLite;
# init shared memory
sub do_work {
# use shared memory, as you just received a signal
# indicating there's new data available
my $signame = shift;
# ...
}
$SIG{USR1} = \&do_work; # when signaled with SIGUSR1, call do_work()
# else just sleep
while(1) { sleep 1; }
希望这有帮助,
-marco -
答案 1 :(得分:3)
查看主题:“嵌入 Perl(使用来自C的Perl)“ - 第21章 Perl编程第三版 - 拉里墙
请特别注意 Internals and C language interface part- Perl调用约定 ç强>
然后,你会知道如何 有效地发送数据 在C和Perl程序之间。
答案 2 :(得分:2)
使用像MySql这样的数据库。
如果您担心性能,请在C中实现perl代码,反之亦然。
答案 3 :(得分:2)
使用 SQLite 之类的数据库,则无需安装数据库服务器。
SQLite Library:http://metacpan.org/pod/DBD::SQLite
答案 4 :(得分:1)
您一直在提及“性能问题”。
请您详细说明您的性能要求是什么?在我们提出最佳解决方案之前,我们需要了解这一点。否则,我们只是在猜测。
在“猜测”类别中,我建议:
在我能想到的绝大多数“现实世界”场景中,这些替代方案中的任何一种都是很好的选择。
我们肯定需要有关您特定情况的更多详细信息。
提前谢谢.. PSM