Вызов функции C из Perl во встроенном приложении C - PullRequest
12 голосов
/ 29 октября 2010

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

Так что яполучил приложение на C, которое вызывает встроенные скрипты Perl.Все это работает отлично и прекрасно, и это довольно здорово, что я могу передать информацию и получить информацию обратно.ОДНАКО, теперь на моем следующем завоевании;Мне нужно, чтобы мои встроенные сценарии могли вызывать некоторые функции в приложении C, которые ОРИГИНАЛЬНО ВЫЗЫВАЛИ ЕГО.

Это важно, потому что XSUB потребовал бы, чтобы это была внешняя библиотека;но я не хочу, чтобы это была внешняя библиотека, я хочу, чтобы это был прямой вызов функции (ей) Си.Теперь, может быть, это можно сделать через XSUB, и я только что прочитал и понял это неправильно.

Application -(run)-> Perl

Application <-(function_x())- Perl

Application -(returnfunction_x)-> Perl

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

1 Ответ

7 голосов
/ 29 октября 2010

XSUB фактически не требуют наличия внешней библиотеки.Они просто предоставляют возможность вызова функции ac из пространства perl и обеспечивают некоторое удобство при отображении соглашений о вызовах между C и Perl.

Все, что вам нужно сделать, - это зарегистрировать XSUB, которые вы скомпилировали в приложение для встраивания, с помощьюВстраиваемый Perl-интерпретатор.

#include "XSUB.h"

XS(XS_some_func);
XS(XS_some_func)
{
    dXSARGS;
    char *str_from_perl, *str_from_c;

    /* get SV*s from the stack usign ST(x) and friends, do stuff to them */
    str_from_perl = SvPV_nolen(ST(0));

    /* do your c thing calling back to your application, or whatever */
    str_from_c = some_c_func(str_from_perl);

    /* pack up the c retval into an sv again and return it on the stack */
    mXPUSHp(c_str);
    XSRETURN(1);
}

/* register the above XSUB with the perl interpreter after creating it */
newXS("Some::Perl::function", XS_some_func, __FILE__);

При встраивании Perl такого рода действия обычно выполняются в функции xs_init, которую вы передаете parse_perl.

EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);

static void
xs_init (pTHX)
{
    newXS("Some::Perl::function", XS_some_func, __FILE__);
    /* possibly also boot DynaLoader and friends. perlembed has more
     * details on this, and ExtUtils::Embed helps as well. */
    newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
}

perl_parse(my_perl, xs_init, argc, my_argv, NULL);

После этого выВы сможете вызывать XSUB как Some::Perl::function из пространства perl, и этот XSUB, в свою очередь, может свободно перезванивать вашему приложению любым удобным для него способом.

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