我需要从c程序发送一些数据到Perl程序,这两个程序都处于运行模式(睡眠模式下的Perl程序和正在运行的c程序,以及c程序将数据发送到Perl)。发送数据从c到perl
我知道,可以通过套接字和共享内存来写这个程序,但是我有性能问题。我认为共享内存是更好的解决方案,我如何向Perl程序发出唤醒信号并恢复运行并读取c发送的数据?
我需要从c程序发送一些数据到Perl程序,这两个程序都处于运行模式(睡眠模式下的Perl程序和正在运行的c程序,以及c程序将数据发送到Perl)。发送数据从c到perl
我知道,可以通过套接字和共享内存来写这个程序,但是我有性能问题。我认为共享内存是更好的解决方案,我如何向Perl程序发出唤醒信号并恢复运行并读取c发送的数据?
使用像MySql这样的数据库。
如果你担心性能在C中实现perl代码,反之亦然。
你似乎有这里有两个问题:可用
假设您所在的系统允许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-
鉴于OP关心的性能考虑使用共享内存而不是unix套接字,我不知道信号在这方面做得有多好? – user2719058 2014-02-02 11:40:56
有一个看题目:“嵌入 Perl(使用C语言的Perl)” - 第21章 每L编程第三版 - 拉里墙
见Internals and C language interface特意这个 本部的Perl调用约定从 Ç。
然后,您将会知道如何在C和Perl程序之间 有效地发送数据 。
您一直提到“性能问题”。
您能否更具体地了解您的性能要求?在我们提出最佳解决方案之前,我们需要知道这一点。否则,我们只是猜测。
在“猜测”的范畴,我会建议:
这两种备选方案将是绝大多数的“真实世界”场景优良替代品我能想到。
我们绝对需要关于您特定场景的更多细节。
预先感谢您.. PSM
解释一下:最好有一些关于程序为什么很慢的想法:它是否保持100%的CPU忙?读取和写入数据是否花费太多时间?你内存不足? – reinierpost 2010-08-26 16:42:58
使用数据库就像SQLite的,那么你并不需要安装数据库服务器。
SQLite Library:http://metacpan.org/pod/DBD::SQLite
不,我不能。我有严重的性能问题 – hamSh 2010-08-26 12:13:48