【发布时间】:2011-04-04 05:53:28
【问题描述】:
我需要将一些数据从 c 程序发送到同时处于运行模式的 Perl 程序(Perl 程序处于睡眠模式和 c 程序运行,c 程序向 Perl 发送数据)。
我知道,可以通过套接字和共享内存编写这个程序,但我有性能问题。我认为共享内存是更好的解决方案,我如何向 Perl 程序发出信号以唤醒并恢复运行和读取 c 发送的数据?
【问题讨论】:
标签: c linux perl shared-memory
我需要将一些数据从 c 程序发送到同时处于运行模式的 Perl 程序(Perl 程序处于睡眠模式和 c 程序运行,c 程序向 Perl 发送数据)。
我知道,可以通过套接字和共享内存编写这个程序,但我有性能问题。我认为共享内存是更好的解决方案,我如何向 Perl 程序发出信号以唤醒并恢复运行和读取 c 发送的数据?
【问题讨论】:
标签: c linux perl shared-memory
使用像 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; }
希望这会有所帮助,
-马可-
【讨论】:
查看主题:“嵌入 Perl(从 C 中使用 Perl)”-第 21 章 Perl 编程第三版 - 拉里·沃尔
请参阅 Internals and C language interface 特别是这个 部分-Perl 调用约定来自 C。
然后,您将知道如何 高效发送数据 在 C 和 Perl 程序之间。
【讨论】:
你一直提到“性能问题”。
您能否更具体地说明您的性能要求是什么?在我们提出最佳解决方案之前,我们需要知道这一点。否则,我们只是猜测。
在“猜测”类别中,我建议:
在我能想到的绝大多数“现实世界”场景中,这些替代方案中的任何一个都是出色的替代方案。
我们肯定需要有关您的特定场景的更多详细信息。
提前谢谢你..PSM
【讨论】:
使用SQLite之类的数据库,则不需要安装数据库服务器。
SQLite 库:http://metacpan.org/pod/DBD::SQLite
【讨论】: