Получение ошибки сегментации при использовании ctypes на xlib - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь получить простой из заставки xlib

Я попытался отладить его, и ошибка начинается после строки

dpy = xlib.XOpenDisplay(os.environ['DISPLAY'].encode('ascii'))

Вот мой код

class XScreenSaverInfo( ctypes.Structure):
    """ typedef struct { ... } XScreenSaverInfo; """
    _fields_ = [('window',      ctypes.c_ulong), # screen saver window
              ('state',       ctypes.c_int),   # off,on,disabled
              ('kind',        ctypes.c_int),   # blanked,internal,external
              ('since',       ctypes.c_ulong), # milliseconds
              ('idle',        ctypes.c_ulong), # milliseconds
              ('event_mask',  ctypes.c_ulong)] # events


xlib = ctypes.cdll.LoadLibrary('libX11.so')
dpy = xlib.XOpenDisplay(os.environ['DISPLAY'].encode('ascii'))
root = xlib.XDefaultRootWindow(dpy)
xss = ctypes.cdll.LoadLibrary( 'libXss.so')
xss.XScreenSaverAllocInfo.restype = ctypes.POINTER(XScreenSaverInfo)
xss_info = xss.XScreenSaverAllocInfo()
xss.XScreenSaverQueryInfo( dpy, root, xss_info)
print("Idle time in milliseconds: %d") % xss_info.contents.idle

Я получаю Segmentation fault (core dumped) ошибку. Пожалуйста, помогите:)

1 Ответ

0 голосов
/ 03 мая 2019

Ошибка в том, что argtypes restype ) не указаны, как описано в [Python 3.Docs]: ctypes - указание необходимых типов аргументов (функцияпрототипы) .Есть много примеров того, что происходит в этом случае, вот 2 из них:

Объявить их для каждой функции перед ее вызовом :

xlib.XOpenDisplay.argtypes = [ctypes.c_char_p]
xlib.XOpenDisplay.restype = ctypes.c_void_p  # Actually, it's a Display pointer, but since the Display structure definition is not known (nor do we care about it), make it a void pointer

xlib.XDefaultRootWindow.argtypes = [ctypes.c_void_p]
xlib.XDefaultRootWindow.restype = ctypes.c_uint32

xss.XScreenSaverQueryInfo.argtypes = [ctypes.c_void_p, ctypes.c_uint32, ctypes.POINTER(XScreenSaverInfo)]
xss.XScreenSaverQueryInfo.restype = ctypes.c_int
...