Ключевые слова:perl, gcc, lib, (найти похожие документы)
Date: Mon, 24 Mar 2003 21:42:37 +0500
From: Andrey Sapozhnikov <[email protected]>
Newsgroups: ftn.ru.perl
Subject: Вcтраивание perl-скрипта в программу на С
> Использую Perl API для вcтраивания perl-скрипта в мою программу на С.
> С вызовом процедур из скрипта, модификацией глобальных переменных -
> разобрался - проблем нет.
>
> Вопрос назрел:
> Hа C реализована некая callback-функция. Как её можно вызвать из perl ?
Упрощеный вариант:
#include <EXTERN.h>
#include <perl.h>
#include <perlio.h>
#include <XSUB.h>
static PerlInterpreter *my_perl;
STATIC void
c_callback(pTHX_ CV *cv)
{
dXSARGS;
if (items != 0)
croak("Usage: callback();");
printf("hello from c\n");
XSRETURN_YES;
}
EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
EXTERN_C void
xs_init(pTHX)
{
char *file = __FILE__;
newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
newXSproto("main::callback", c_callback, file, "");
}
int main(int argc, char **argv, char **env)
{
char *myargv[]={ "","test.pl",NULL};
my_perl = perl_alloc();
perl_construct(my_perl);
perl_parse(my_perl, xs_init, 2, myargv, NULL);
call_argv("perl_sub", G_DISCARD, NULL);
perl_destruct(my_perl);
perl_free(my_perl);
}
передавать ссылку никуда не нужно, функция callback() будет
видна в пространстве имен main и в своей функции perl_sub
Вы можете ее просто вызвать по имени. Однако, если Вам
понадобится в будущем чуть больше функциональности, рекомендую
сразу писать расширение как XS (perldoc perlxs, perldoc perlxstut).
P.S. Я в этом примере заодно инициализировал DynaLoader. Почти
наверняка Вам это пригодится.