我先介绍要从perl里面调用C的函数的处理方法 :
请大家下看下面的代码, 其中关键的地方为 void boot_DEP (pTHX_ CV* cv) 函数, 还有 newXS("DEP::bootstrap", boot_DEP, file);
这两个函数代表的意思是: DEP为 perl 调用C的模块名, 也就是说我们还需要写一个 DEP.pm的模块,让其他的perl模块编译的时候不至于编译出错。
newXS 这个函数比较特殊,相当于perl会做一个 key--->Value的映射关系, DEP.pm 里面的bootstrap函数调用会映射为C里面的
boot_DEP函数调用。
函数 xs_init 这个函数是perl内置的回调函数, perl会调用它, 在xs_init函数里面会调用boot_DEP函数, boot_DEP函数里面的
newXS ("DEP::shutdown", xs_shutdown, "COMMON.c"); 相当于什么呢 ?
相当于做了key---->value 的映射关系 , 当perl调用 DEP模块的shutdown时, 就会变为调用C的 xs_shutdown函数。
下面在看看DEP.pm这个模块的代码
下来随便写个 xxx.pl文件, 内容如下, 在C中的xs_shutdown函数中设置个断点, 调试启动,就会看到perl调用到C里面了。
经过本人测试, 有个比较奇怪的地方,就是在 xxx.pl文件的开始的地方 用use DEP; 把sub bar 函数中的 require DEP; 去掉,
会造成 perl无法调用到C的问题, 不知道为什么, 只能像下面这样使用才能调用到C的代码里面。
C调用Perl就比较简单了, 需要注意的是 PERL_SYS_INIT3(argc,argv,env); 很关键。 最好在main函数入口就调用该函数。
还有就是 在 perl_construct 函数之前需要设置 PL_perl_destruct_level 为1, 具体代码如下:
PL_perl_destruct_level = 1;
perl_construct ( poPerlInterpreter );
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
另外是如果同一个进程内需要多个perl的解释器同时运行的话, 在调用perl解释器处理事务的时候需要对当前的perl解释器进行设置,
用 PERL_SET_CONTEXT 进行设置当前的解释器。