|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 24 Mar 2003 22:42:37 To : Vladimir Ivanov Subject : Re: Вызов C callback из embedded perl -------------------------------------------------------------------------------- Vladimir Ivanov wrote: > Hello, All! > > Использую Perl API для вcтраивания perl-скрипта в мою программу на С. > С вызовом процедур из скрипта, модификацией глобальных переменных - > разобрался - проблем нет. > > Вопрос назрел: > Hа C реализована некая callback-функция. Как её можно вызвать из perl ? > > Т.е. сделать что-то вроде-этого: > > ------- perl'овый код: test.pl ------ > > sub perl_sub > { > # ? my $callback = shift; > print "hello from perl\n"; > # ? &$callback ; # вызов сallback > } > > ------ Сишный код: test.c -------- > #include <EXTERN.h> > #include <perl.h> > static PerlInterpreter *my_perl; > > void c_callback() > { > printf ("hello from c\n"); > } > > 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, NULL, 2, myargv, NULL); > > call_argv("perl_sub", G_DISCARD, NULL); > // здесь необходимо передать в качестве параметра > // нечто вроде ссылки на c_callback > > perl_destruct(my_perl); > perl_free(my_perl); > } > ------------------------------- > > Hеобходимо на выходе получить: > --------- > hello from perl > hello from c > --------- > Help plz. > В принципе, передача "ссылки на код" через параметр не обязательна - > сгодятся > варианты вызова заранее предопределённых C-шных функций. > > Вариант написать модуль - не подходит. > > With best regards, > Vladimir Ivanov. Упрощеный вариант: #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. Почти наверняка Вам это пригодится. --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/65779d79e478.html, оценка из 5, голосов 10
|