Я пытаюсь понять модуль Python "ctypes". Я собрал тривиальный пример, который - в идеале - оборачивает вызов функции statvfs (). Код выглядит так:
from ctypes import *
class struct_statvfs (Structure):
_fields_ = [
('f_bsize', c_ulong),
('f_frsize', c_ulong),
('f_blocks', c_ulong),
('f_bfree', c_ulong),
('f_bavail', c_ulong),
('f_files', c_ulong),
('f_ffree', c_ulong),
('f_favail', c_ulong),
('f_fsid', c_ulong),
('f_flag', c_ulong),
('f_namemax', c_ulong),
]
libc = CDLL('libc.so.6')
libc.statvfs.argtypes = [c_char_p, POINTER(struct_statvfs)]
s = struct_statvfs()
res = libc.statvfs('/etc', byref(s))
print 'return = %d, f_bsize = %d, f_blocks = %d, f_bfree = %d' % (
res, s.f_bsize, s.f_blocks, s.f_bfree)
Выполнение этого неизменно возвращает:
return = 0, f_bsize = 4096, f_blocks = 10079070, f_bfree = 5048834
*** glibc detected *** python: free(): invalid next size (fast): 0x0000000001e51780 ***
*** glibc detected *** python: malloc(): memory corruption (fast): 0x0000000001e517e0 ***
Я не смог найти ни одного примера вызова функций со сложными типами как параметры (есть много примеров функций, которые возвращают сложные типы), но после запуска в документации по ctypes в течение дня или около того я думаю, что мой синтаксис вызова правильный ... и он фактически вызывает вызов statvfs () и возвращает правильные результаты.
Я неправильно понимаю документацию ctypes? Или здесь что-то еще происходит?
Спасибо!