Python调用C语言so库,回调函数报错Segmentation fault

dodott 2020-10-15 06:33:49
公司硬件开发,使用全志R16芯片,操作系统是基于Openwrt系统的。

python开发的高效性,但是公司项目代码过去是用C语言写的,于是决定将老版代码编译成so库,然后Python来调用。
为此特地写了一套python和c的测试代码,验证一下python调用C的可行性。
测试代码中:Python会将一些功能函数设置为C语言中的回调函数,让C代码中可以方便调用。

步骤:
1,C代码利用GCC编译成so文件;
2,Python利用ctypes库,调用so文件。

开始运行,在PC(x86架构)上,在Windows和Linux系统中都顺利运行了。
结论:代码没有语法问题,内存、指针的管理都正确

于是我就换成交叉编译器,将C代码编译成Openwrt的ARM内核硬件可以跑的so文件
然后同样运行python 代码,结果只要运行到C语言中调用python回调函数的地方,就会报Segmentation fault.

哪位大神有这方面经验,还望指点指点。


附上python代码:

import ctypes
from ctypes import *

def PyCoreCB( a ):
print('CallBack Core - {}'.format(a))
return 5

#-----------------------------------------------
def BeginTry():
ll = ctypes.cdll.LoadLibrary
lib = ll("./PyObjArm.so")
#lib = ll("./PyObj.so")

CMPCORE = CFUNCTYPE(c_int,c_int)
cCoreFunc = CMPCORE(PyCoreCB)

try:
lib.ZExeCB.restype = c_int
lib.ZExeCB( cCoreFunc)
except Exception as e:
print('Error: {}'.format( repr(e) ))

print('---------Print Test--------')

BeginTry()



附上C代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int (*cb_core)(int a);

int ZExeCB( cb_core df )
{
if(df!=NULL)
{
printf("%s","Exec Main CB2 \r\n");
df(2);
}

return 5;
}


...全文
812 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianfang 2020-10-15
  • 打赏
  • 举报
回复
https://stackoverflow.com/questions/37953055/segmentation-fault-when-using-ctypes-and-threading

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧