【问题标题】:Sending data from c to perl将数据从 c 发送到 perl
【发布时间】:2011-04-04 05:53:28
【问题描述】:

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

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

【问题讨论】:

    标签: c linux perl shared-memory


    【解决方案1】:

    使用像 MySql 这样的数据库。

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

    【讨论】:

      【解决方案2】:

      你这里似乎有两个问题:

      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; }
      

      希望这会有所帮助,

      -马可-

      【讨论】:

      • 鉴于 OP 非常关注性能以考虑使用共享内存而不是 unix 套接字,我想知道信号在这方面的表现如何?
      【解决方案3】:
      • 查看主题:“嵌入 Perl(从 C 中使用 Perl)”-第 21 章 Perl 编程第三版 - 拉里·沃尔

      • 请参阅 Internals and C language interface 特别是这个 部分-Perl 调用约定来自 C

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

      【讨论】:

        【解决方案4】:

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

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

        在“猜测”类别中,我建议:

        • 管道
        • 数据库

        在我能想到的绝大多数“现实世界”场景中,这些替代方案中的任何一个都是出色的替代方案。

        我们肯定需要有关您的特定场景的更多详细信息。

        提前谢谢你..PSM

        【讨论】:

        • 解释一下:最好能了解一下程序为什么这么慢:它是否让 CPU 保持在 100% 的忙碌状态?读取和写入数据是否需要太多时间?你的内存用完了吗?
        【解决方案5】:

        使用SQLite之类的数据库,则不需要安装数据库服务器。

        SQLite 库:http://metacpan.org/pod/DBD::SQLite

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-08
          • 1970-01-01
          • 1970-01-01
          • 2021-05-24
          • 1970-01-01
          • 2017-01-05
          • 2021-03-05
          • 1970-01-01
          相关资源
          最近更新 更多