使用 python ctypes 在 libc.so.6 中调用 iswctype 函数时出现分段错误
Segmentation Fault when call iswctype function in libc.so.6 using python ctypes
我正在 python 学习 ctypes 模块。我有以下代码:
代码
import sys
print(sys.version)
import ctypes
libc = ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6")
print(libc)
for x in "我学Python!":
print("'%s'" % x, libc.iswalpha(
ord(x)
))
libc.wctype.argtypes = [ctypes.c_char_p]
alpha_wctype = libc.wctype(b'print')
print(type(alpha_wctype))
libc.iswctype.restype = ctypes.c_int
print(libc.iswctype(ord("我"), alpha_wctype))
输出
3.7.7 (default, May 7 2020, 21:25:33)
[GCC 7.3.0]
<CDLL '/lib/x86_64-linux-gnu/libc.so.6', handle 7f1d5b9e24f0 at 0x7f1d5a498f10>
'我' 1
'学' 1
'P' 1024
'y' 1024
't' 1024
'h' 1024
'o' 1024
'n' 1024
'!' 0
<class 'int'>
Fatal Python error: Segmentation fault
Current thread 0x00007f1d5b9dd740 (most recent call first):
File "test2.py", line 15 in <module>
[1] 12178 segmentation fault python -X faulthandler test2.py
那么为什么最后一行产生了分段错误,我如何使用 ctypes 正确使用 iswctype?
wctype
不是 return 一个 int
,而是一个 wctype_t
。 Python 没有可移植的 ctypes
类型,但它可能是您系统上的 unsigned long
,libc.wctype.restype = ctypes.c_ulong
也是如此。同样,您需要为 iswctype
指定参数类型,如下所示:libc.iswctype.argtypes = [ctypes.c_uint, ctypes.c_ulong]
。如果不做这些事情,您将截断 alpha_wctype
值,这会导致段错误。
我正在 python 学习 ctypes 模块。我有以下代码:
代码
import sys
print(sys.version)
import ctypes
libc = ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6")
print(libc)
for x in "我学Python!":
print("'%s'" % x, libc.iswalpha(
ord(x)
))
libc.wctype.argtypes = [ctypes.c_char_p]
alpha_wctype = libc.wctype(b'print')
print(type(alpha_wctype))
libc.iswctype.restype = ctypes.c_int
print(libc.iswctype(ord("我"), alpha_wctype))
输出
3.7.7 (default, May 7 2020, 21:25:33)
[GCC 7.3.0]
<CDLL '/lib/x86_64-linux-gnu/libc.so.6', handle 7f1d5b9e24f0 at 0x7f1d5a498f10>
'我' 1
'学' 1
'P' 1024
'y' 1024
't' 1024
'h' 1024
'o' 1024
'n' 1024
'!' 0
<class 'int'>
Fatal Python error: Segmentation fault
Current thread 0x00007f1d5b9dd740 (most recent call first):
File "test2.py", line 15 in <module>
[1] 12178 segmentation fault python -X faulthandler test2.py
那么为什么最后一行产生了分段错误,我如何使用 ctypes 正确使用 iswctype?
wctype
不是 return 一个 int
,而是一个 wctype_t
。 Python 没有可移植的 ctypes
类型,但它可能是您系统上的 unsigned long
,libc.wctype.restype = ctypes.c_ulong
也是如此。同样,您需要为 iswctype
指定参数类型,如下所示:libc.iswctype.argtypes = [ctypes.c_uint, ctypes.c_ulong]
。如果不做这些事情,您将截断 alpha_wctype
值,这会导致段错误。