调用perl函数newSVpv()时C程序不断崩溃

前端之家收集整理的这篇文章主要介绍了调用perl函数newSVpv()时C程序不断崩溃前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
尝试使用perl数据结构(部分作为支持C中的关联数组的方式),但以下程序不断崩溃.它编译得很好但会在newSVpv()上崩溃.不知道为什么.

#include <EXTERN.h>               /* from the Perl distribution     */
#include <perl.h>                 /* from the Perl distribution     */
static PerlInterpreter *my_perl;  /***    The Perl interpreter    ***/
int main(int argc,char **argv,char **env) {
    char *proto = "http";
    SV* ret = newSVpv("http",4);
    sv_catpvn(ret,"://",3);
    STRLEN len = 1;
    char *result = SvPV(ret,len);
    printf("result: %p %d\n",result,len);
    return 0;
}

编译它的行是

gcc -g -o interp te1.c `perl -MExtUtils::Embed -e ccopts -e ldopts`

我所拥有的perl是在Ubuntu 12.04.4 LTS上运行的5.14.2.

谢谢你的任何提示

更新:添加了gdb跟踪.谢谢你的询问.
gdb跟踪:

Program received signal SIGSEGV,Segmentation fault.
0x00007ffff7b235a6 in Perl_newSVpv () from /usr/lib/libperl.so.5.14
(gdb) bt
#0  0x00007ffff7b235a6 in Perl_newSVpv () from /usr/lib/libperl.so.5.14
#1  0x0000000000400927 in main (argc=1,argv=0x7fffffffe1e8,env=0x7fffffffe1f8) at te1.c:7
(gdb)

解决方法

我通常从Perl调用C,而不是从C调用Perl,但我很确定你的问题是你没有复制 perlembed example中的PERL_SYS_INIT3,perl_alloc和perl_construct位,所以你实际上没有一个perl解释器结构可以使用.当newSVpv试图通过不存在的解释器指针访问某些东西时,它正在轰炸.

该示例的最后三行(perl_destruct,perl_free和PERL_SYS_TERM)也应在程序结束时调用,这是一种良好的实践.

猜你在找的Perl相关文章