4

尝试使用 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) 
4

1 回答 1

7

我通常从 Perl 调用 C,而不是从 C 调用 Perl,但我很确定你的问题是你没有从perlembed 示例PERL_SYS_INIT3中复制,perl_alloc和bits ,所以你实际上没有 perl要使用的解释器结构。当它试图通过不存在的解释器指针访问某些东西时,它正在爆炸。perl_constructnewSVpv

作为良好实践,该示例的最后三行(perl_destructperl_freePERL_SYS_TERM)也应该在程序结束时调用。

于 2015-02-17T22:58:53.657 回答