Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Вызов C callback из embedded perl   Vladimir Ivanov   24 Mar 2003 21:21:02 
 Re: Вызов C callback из embedded perl   Andrey Sapozhnikov   24 Mar 2003 22:42:37 
 Re: Вызов C callback из embedded perl   Vladimir Ivanov   25 Mar 2003 10:26:10 
 Re: Вызов C callback из embedded perl   Vladimir Ivanov   25 Mar 2003 11:24:32 
Архивное /ru.perl/65779d79e478.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional