2010-08-26 68 views
4

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

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

回答

2

使用像MySql这样的数据库。

如果你担心性能在C中实现perl代码,反之亦然。

+0

不,我不能。我有严重的性能问题 – hamSh 2010-08-26 12:13:48

7

你似乎有这里有两个问题:可用

  1. 如何在Perl程序和C程序之间共享内存,并
  2. 如何信号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-

+0

鉴于OP关心的性能考虑使用共享内存而不是unix套接字,我不知道信号在这方面做得有多好? – user2719058 2014-02-02 11:40:56

3
  • 有一个看题目:“嵌入 Perl(使用C语言的Perl)” - 第21章 每L编程第三版 - 拉里墙

  • Internals and C language interface特意这个 本部的Perl调用约定从 Ç

    然后,您将会知道如何在C和Perl程序之间 有效地发送数据 。

1

您一直提到“性能问题”。

您能否更具体地了解您的性能要求?在我们提出最佳解决方案之前,我们需要知道这一点。否则,我们只是猜测。

在“猜测”的范畴,我会建议:

  • 数据库

这两种备选方案将是绝大多数的“真实世界”场景优良替代品我能想到。

我们绝对需要关于您特定场景的更多细节。

预先感谢您.. PSM

+0

解释一下:最好有一些关于程序为什么很慢的想法:它是否保持100%的CPU忙?读取和写入数据是否花费太多时间?你内存不足? – reinierpost 2010-08-26 16:42:58