我正在尝试使用ctypes在Python中构建绑定。
我想从我的Python项目中调用ioctl。
首先,这是与我使用的结构类似的结构。
class struct_some_struct(Structure):
_fields_ = [("field1", c_uint32),
("field2", POINTER(c_uint8)]
假设我们声明了类似的内容:
mystruct = struct_some_struct()
这是合约。 我目前正在使用addressof()。它在大多数情况下都会成功,但是当地址大于INT_MAX时(经常在64位机器上发生),我遇到了问题,得到OverFlowErrors,e.t.c。所以我在考虑使用pointer()而不是addressof()来重写它。
我需要获取field1的地址,因为ioctl需要一个指向这个特定字段的指针。 该字段由先前的ioctl调用填充,该调用将指针传递给mystruct(该ioctl没有问题)。
使用addressof(),解决方案可能是:
addressof(mystruct) + struct_some_struct.field1.offset
这将是field1的地址。
但正如我所提到的,我不想使用addressof()。
如何将指针()(指向field1的指针)对象传递给ioctl()?
打字:
pointer(mystruct.field1)
不会工作,因为type(mystruct.field1)不是c_uint32,而是根据Python的int。
也做类似的事情:
pointer(c_uint32(mystruct.field1))
也不好,因为ioctl可能会改变field1,而这样做的改变不会影响mystrcuct.field1值。
我可以使用byref(mystruct,struct_some_struct.field1.offset),但fcntl.ioctl不接受它(libc' s ioctl接受它)
提前致谢。