gpt4 book ai didi

c - XS:将外部库的函数传递给 Perl XS 回调

转载 作者:太空狗 更新时间:2023-10-29 15:40:11 27 4
gpt4 key购买 nike

免责声明:在 perlmonks 询问.

我希望我正确地描述和描述了我的问题......在 XS 中,我试图将回调发送到外部库的函数,其中回调具有 Perl 特定的函数。 XSUB 作为函数指针传递给外部 C 函数。依次发送的 XSUB 回调会回调到 `main` perl 应用程序中的子程序:

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!

关于c - XS:将外部库的函数传递给 Perl XS 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38946293/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com