免责声明:
perlmonks被问及.
我希望我正确地描述和描述我的问题……在XS中,我正在尝试将回调发送到外部库的函数,其中回调具有Perl特定的函数. XSUB作为函数指针传递给外部C函数.发送的XSUB回调又将回调到`main` perl应用程序中的sub:
void callback(){ dSP; PUSHMARK(SP); call_pv("p_callback",G_DISCARD|G_NOARGS); } // example extern call externFunc(&callback);
这段错误.我认为这是因为外部库不理解被调用的perl函数.如果我直接调用C`callback()函数,事情就可以了.
是否有一些魔法可以让外部库“看到”Perl C函数,或者我做错了什么?
这是我正在测试的代码:
use warnings; use strict; use Inline ('C' => 'DATA',libs => '-lwiringPi'); init(); setInterrupt(27,3); # direct call callback(); # on() triggers the external function and sends # it the callback on(27); sub p_callback { print "in perl callback\n"; } __DATA__ __C__ #include <stdlib.h> #include <stdio.h> #include <wiringPi.h> void init(); void on(int pin); void off(int pin); void setInterrupt(int pin,int edge); void callback(); void init(){ printf("in init\n"); wiringPiSetup(); } void on(int pin){ pinMode(pin,1); digitalWrite(pin,1); } void off(int pin){ digitalWrite(pin,0); pinMode(pin,0); } void setInterrupt(int pin,int edge){ wiringPiISR(pin,edge,&callback); } void callback(){ dSP; PUSHMARK(SP); call_pv("p_callback",G_DISCARD|G_NOARGS); }
输出:
in init in perl callback Segmentation fault
如果我从回调中删除perl特定的C调用并且只执行`printf()`或其他纯C工作,那么事情就会在没有段错误的情况下继续进行.
解决方法
刚刚遇到这个问题并认为我会给出我自己的答案,就像我前一段时间解决它一样.
我设置Perl上下文以及C exec_perl_callback()函数中缺少一些重要的部分.
use warnings; use strict; use Inline 'C'; use Inline 'NoClean'; sub p_callback { print "hello,world from perl!\n"; } exec_perl_callback('p_callback'); __END__ __C__ #define PERL_NO_GET_CONTEXT PerlInterpreter * mine; void callback(char* perl_callback){ PERL_SET_CONTEXT(mine); dSP; ENTER; SAVETMPS; PUSHMARK(SP); PUTBACK; exec_perl_callback(perl_callback,G_DISCARD|G_NOARGS); FREETMPS; LEAVE; }
输出:
hello world,from perl!