将数据从c发送到perl

时间:2010-08-26 12:09:53

标签: c linux perl shared-memory

我需要从c程序向Perl程序发送一些数据,这些数据都处于运行模式(睡眠模式下的Perl程序和c程序运行,c程序将数据发送到Perl)。

我知道,可以通过套接字和共享内存编写这个程序但是我有性能问题。我认为共享内存是更好的解决方案,我怎样才能发信号通知Perl程序唤醒并恢复运行并读取发送的数据?

5 个答案:

答案 0 :(得分:7)

您似乎有两个问题:

  1. 如何在Perl程序和C程序之间共享内存,以及
  2. 如何向Perl程序发出信号,提供新数据
  3. 假设您所在的系统允许进行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