linux下c 调用python,在Linux下使用python ctypes调用io\u submit

我正在尝试使用python ctypes调用io帴ubmit。

我写的代码应该可以在32位和64位Intel/AMD体系结构上工作,但这里我将重点放在64位上。在

我定义了以下内容:def PADDED64(type, name1, name2):

return [(name1, type), (name2, type)]

def PADDEDptr64(type, name1, name2):

return [(name1, type)]

def PADDEDul64(name1, name2):

return [(name1, ctypes.c_ulong)]

class IOVec(ctypes.Structure):

_fields_ = [("iov_base", ctypes.c_void_p), ("iov_len", ctypes.c_size_t)]

class IOCBDataCommon64(ctypes.Structure):

_fields_ = PADDEDptr64(ctypes.c_void_p, "buf", "__pad1") + \

PADDEDul64("nbytes", "__pad2") + \

[("offset", ctypes.c_longlong), ("__pad3", ctypes.c_longlong), ("flags", ctypes.c_uint), ("resfd", ctypes.c_uint)]

class IOCBDataVector(ctypes.Structure):

_fields_ = [("vec", ctypes.POINTER(IOVec)), ("nr", ctypes.c_int), ("offset", ctypes.c_longlong)]

class IOCBDataPoll64(ctypes.Structure):

_fields_ = PADDED64(ctypes.c_int, "events", "__pad1")

class SockAddr(ctypes.Structure):

_fields_ = [("sa_family", ctypes.c_ushort), ("sa_data", ctypes.c_char * 14)]

class IOCBDataSockAddr(ctypes.Structure):

_fields_ = [("addr", ctypes.POINTER(SockAddr)), ("len", ctypes.c_int)]

class IOCBDataUnion64(ctypes.Union):

_fields_ = [("c", IOCBDataCommon64), ("v", IOCBDataVector), ("poll", IOCBDataPoll64), ("saddr", IOCBDataSockAddr)]

class IOCB64(ctypes.Structure):

_fields_ = PADDEDptr64(ctypes.c_void_p, "data" , "__pad1") + \

PADDED64(ctypes.c_uint, "key", "__pad2") + \

[("aio_lio_opcode", ctypes.c_short), ("aio_reqprio", ctypes.c_short), ("aio_fildes", ctypes.c_int), ("u", IOCBDataUnion64)]

class Timespec(ctypes.Structure):

_fields_ = [("tv_sec", ctypes.c_long), ("tv_nsec", ctypes.c_long)]

class IOEvent64(ctypes.Structure):

_fields_ = PADDEDptr64(ctypes.c_void_p, "data", "__pad1") + \

PADDEDptr64(ctypes.POINTER(IOCB64), "obj", "__pad2") + \

PADDEDul64("res", "__pad3") + \

PADDEDul64("res2", "__pad4")

我有一个名为AIOCommands的包装类:

^{pr2}$

我已经定义了io\u submit的参数和返回值:class Executor:

def __init__(self, aioLibraryPath):

self.__aio = ctypes.CDLL(aioLibraryPath)

self.__aio.io_submit.argtypes = [self.aio_context_t, ctypes.c_long, ctypes.POINTER(ctypes.POINTER(IOCB64))]

self.__aio.io_submit.restype = ctypes.c_long

现在,该怎么办遗嘱执行人提交身体看起来像?我试过了:def io_submit(self, aioContext, aioCommands):

iocbPtr = ctypes.cast(aioCommands.getIOCBArray(), ctypes.POINTER(self.iocb_t))

return self.__aio.io_submit(aioContext, aioCommands.size(), ctypes.byref(iocbPtr))

但是每当aiocommandlest的长度大于1时,我就会得到一个分段错误。

当列表只包含1个命令时,代码按预期工作。在

这可能是我的结构定义有问题吗?我试图模仿libaio.h中的定义(假设只支持little-endian架构):#if defined(__i386__) /* little endian, 32 bits */

#define PADDED(x, y) x; unsigned y

#define PADDEDptr(x, y) x; unsigned y

#define PADDEDul(x, y) unsigned long x; unsigned y

#elif defined(__ia64__) || defined(__x86_64__) || defined(__alpha__)

#define PADDED(x, y) x, y

#define PADDEDptr(x, y) x

#define PADDEDul(x, y) unsigned long x

#elif defined(__powerpc64__) /* big endian, 64 bits */

#define PADDED(x, y) unsigned y; x

#define PADDEDptr(x,y) x

#define PADDEDul(x, y) unsigned long x

#elif defined(__PPC__) /* big endian, 32 bits */

#define PADDED(x, y) unsigned y; x

#define PADDEDptr(x, y) unsigned y; x

#define PADDEDul(x, y) unsigned y; unsigned long x

#elif defined(__s390x__) /* big endian, 64 bits */

#define PADDED(x, y) unsigned y; x

#define PADDEDptr(x,y) x

#define PADDEDul(x, y) unsigned long x

#elif defined(__s390__) /* big endian, 32 bits */

#define PADDED(x, y) unsigned y; x

#define PADDEDptr(x, y) unsigned y; x

#define PADDEDul(x, y) unsigned y; unsigned long x

#else

#error endian?

#endif

struct io_iocb_poll {

PADDED(int events, __pad1);

}; /* result code is the set of result flags or -'ve errno */

struct io_iocb_sockaddr {

struct sockaddr *addr;

int len;

}; /* result code is the length of the sockaddr, or -'ve errno */

struct io_iocb_common {

PADDEDptr(void *buf, __pad1);

PADDEDul(nbytes, __pad2);

long long offset;

long long __pad3;

unsigned flags;

unsigned resfd;

}; /* result code is the amount read or -'ve errno */

struct io_iocb_vector {

const struct iovec *vec;

int nr;

long long offset;

}; /* result code is the amount read or -'ve errno */

struct iocb {

PADDEDptr(void *data, __pad1); /* Return in the io completion event */

PADDED(unsigned key, __pad2); /* For use in identifying io requests */

short aio_lio_opcode;

short aio_reqprio;

int aio_fildes;

union {

struct io_iocb_common c;

struct io_iocb_vector v;

struct io_iocb_poll poll;

struct io_iocb_sockaddr saddr;

} u;

};

任何帮助都将不胜感激,我已经被困在这几个小时了。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值