我在c中有一个“路由器之类”项目,处理不同的数据包。它已经工作正常了。 现在我将它扩展为在python中处理一些新数据包。我使用Swig来包装一些现有的函数(比如将数据包发送到较低层)。
当我唤起包装函数时会出现问题:
//router.c
Queue_t *queue;
....
//processPkt.c
int process_new_in_c(pkt)
{
if(pkt.new == True)
Py_init();
init_MyModule();
import_Module(process.py);
process_new_in_py(pkt);
Py_finalize();
....
}
//processNew.py
def process_new_in_py(pkt)
...
MyModule.sendToLowerLayer(pkt);
//lowerlayer.c->wrapped into MyModule
int sendToLowerLayer(pkt)
{
...
sendToQueue(queque, pkt);
}
队列是外出数据包的缓冲区,在程序启动时会初始化。
然而,当我调用包装函数MyModule.sendToLowerLayer(queue, pkt)
时,程序崩溃了。我确保它应该在初始化时收到一个Null队列指针。
process_new_in_c
sendToLowerLayer()
暴露给不需要队列参数的Python。但它稍后调用了sendToQueue()
这个问题让我疯狂T_T
我的.i文件是:
%module MyModule
%inline% {
#include ...
int sendToLowerLayer(pkt);
%}
对于懒惰的代码很抱歉,我只是害怕原始代码太多而无法阅读。
我有process_new_in_c
调用process_new_in_py
,并且在python函数中我调用了一个包装的C函数send_to_lower_layer
,queue
已在C中声明并初始化,但是当我调用包装函数send_to_lower_layer
时,queue
似乎从未初始化。
我认为问题可能是:
在调用init_MyModule()
时,它声明了一个fake global variable
,如:MyModule.queue
,它永远不会被初始化。
所以当代码执行到sendToQueue(queue, pkt)
时,它实际上是用MyModule.queue
而不是队列调用(在C部分内有一个有效值)