Отправка данных из c в perl - PullRequest
       5

Отправка данных из c в perl

4 голосов
/ 26 августа 2010

Мне нужно отправить некоторые данные из c-программы в Perl-программу, которая работает как в рабочем режиме (Perl-программа в спящем режиме, так и c-программа работает, а c-программа отправляет данные в Perl).

Я знаю, чтомогу написать эту программу по сокету и разделяемой памяти, но у меня проблема с производительностью.Я думаю, что совместная память - лучшее решение, и как я могу дать сигнал программе Perl, чтобы она проснулась и возобновила выполнение и чтение данных, которые можно было отправить?

Ответы [ 5 ]

7 голосов
/ 26 августа 2010

Похоже, у вас есть два вопроса:

  1. как разделить память между программой Perl и вашей C-программой и
  2. как сообщить программе Perl, что появились новые данныедоступно

Предполагая, что вы работаете в системе, которая разрешает вызовы SysV IPC, вы можете использовать IPC :: ShareLite , чтобы разделить часть памяти между двумя процессами.

Как обычно, с общей памятью, вы должны убедиться, что блокировки на месте.Страница руководства модуля для IPC :: ShareLite, кажется, объясняет сложности и вызовы метода довольно хорошо.

Что касается сигнализации программы Perl, что есть новые данные, ничто не мешает вам использовать ... сигналы для достижениятот!Ваша C-программа может отправить SIGUSR1 в Perl-программу, а Perl-программа получит доступ к общей памяти и выполнит какие-либо действия при получении сигнала, а в противном случае перейдет в режим сна.* для этого, но суть этого что-то вроде этого:

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-

3 голосов
/ 26 августа 2010
  • Посмотрите на тему: "Встраивание Perl (Использование Perl из C) " - глава 21 Программирование на Perl, третье издание - Ларри Уолл

  • См. Internals and C language интерфейс специально это part- Соглашения о вызовах Perl от C .

    Тогда вы узнаете, как эффективно отправлять данные между C и Perl Program.

2 голосов
/ 09 августа 2012

Используйте базу данных вроде SQLite , тогда вам не нужно устанавливать сервер базы данных.

Библиотека SQLite: http://metacpan.org/pod/DBD::SQLite

2 голосов
/ 26 августа 2010

Используйте базу данных, как MySql.

Если вы беспокоитесь о производительности, используйте Perl-код на C или наоборот.

1 голос
/ 26 августа 2010

Вы продолжаете ссылаться на «проблему с производительностью».

Не могли бы вы быть более точным в том, каковы ваши требования к производительности?Нам нужно знать это, прежде чем мы сможем предложить оптимальное решение.В противном случае мы просто угадываем.

В категории "угадывания" я бы порекомендовал:

  • трубы
  • база данных

Любая из этих альтернатив была бы отличной альтернативой в подавляющем большинстве сценариев "реального мира", о которых я мог подумать.

Нам определенно нужны более подробные сведения о вашем конкретном сценарии.

Заранее спасибо.. PSM

...