Python ctypes: как выделить выходной буфер для функции C в обратном вызове - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть следующий обратный вызов в качестве одного из аргументов в функции в c-коде:

typedef unsigned char* (*my_callback)(int size);
//for example:
unsigned char * tmp_buff = nullptr;
tmp_buff = i_alloc_fn(10);
printf("Tmp buff addr = %d.\n", tmp_buff);
*tmp_buff = 111;
printf("I am still alive");

Я пытаюсь предоставить этот обратный вызов из python (C-код загружается как .so lib).Я попробовал 2 способа.

ALLOC_CALLBACK_FUNC = ctypes.CFUNCTYPE(ctypes.c_char_p, ctypes.c_int)
#...
def py_alloc_callback(size):
    libc = ctypes.CDLL("libc.so.6") 
    mem_ptr = libc.malloc(ctypes.c_uint(size))
    return mem_ptr

И

ALLOC_CALLBACK_FUNC = ctypes.CFUNCTYPE(ctypes.c_char_p, ctypes.c_int)
stringbuffer = ''
#...
def py_alloc_callback(size):
    global stringbuffer
    stringbuffer=ctypes.create_string_buffer(size)

    return ctypes.POINTER(ctypes.c_ubyte)(stringbuffer)

Но оба варианта привели к ошибке сегментации в C-коде, когда он пытался записать в выделенную память.Пожалуйста, помогите мне исправить это

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Теперь это работает:

def py_alloc_callback(size):
    libc = ctypes.CDLL("libc.so.6") 
    alloc_f = libc.malloc
    alloc_f.restype = ctypes.c_void_p
    alloc_f.argtypes = [ ctypes.c_uint ] 
    return alloc_f(ctypes.c_uint(size))
0 голосов
/ 10 декабря 2018
mem_ptr = libc.malloc(ctypes.c_uint(size))

явно не так.Параметр malloc имеет тип size_t.

...