获取对结构成员的引用

Get reference to struct member

我有以下结构:

import ctypes as c
class sigaction_t(c.Structure):
    _fields_ = [
        ("sa_handler", c.c_void_p),
        ("sa_sigaction", c.c_void_p),
        ("sa_mask", c.c_int),
        ("sa_flags", c.c_int),
        ("sa_restorer", c.c_void_p),
    ]

如何获取此结构成员的引用?下面似乎不适用于 sa_mask...

lib = c.cdll.LoadLibrary("libc.so.6")
sa = sigaction_t()
lib.sigemptyset(c.byref(sa.sa_mask)) #not working

TypeError: byref() argument must be a ctypes instance, not 'int'

我想我们可以说 sigemptyset 期望 c.POINTER(c.c_int)

sa.sa_mask,访问时,return是 Python int 而不是 ctypes.c_int,因此不能作为参考。有多种方法可以解决这个问题

  1. 禁止将 c_int return 值自动转换为 Python int。派生 类 将 return 一个 c_int 对象及其 .value 可以请求检索 Python int:
import ctypes as c

class raw_c_int(c.c_int): pass  # Derived classes suppress the conversion

class sigaction_t(c.Structure):
    _fields_ = (("sa_handler", c.c_void_p),
                ("sa_sigaction", c.c_void_p),
                ("sa_mask", raw_c_int),  # use derived class
                ("sa_flags", c.c_int),
                ("sa_restorer", c.c_void_p))

sa = sigaction_t()
lib.sigemptyset(c.byref(sa.sa_mask))
print(sa.sa_mask.value)
  1. 引入一个临时变量:
sa = sigaction_t()
mask = c.c_int()
lib.sigemptyset(c.byref(mask)))
sa.sa_mask = mask
  1. 使用 byref 的可选第二个参数计算成员的偏移量。根据您的 sigemptyset.argtypes 定义,这可能需要强制转换,因为不幸的是 returned 引用仍然具有类型 POINTER(sigaction_t):
sa = sigaction_t()
lib.sigemptyset(c.byref(sa, sigaction_t.sa_mask.offset))

# or

sa = sigaction_t()
lib.sigemptyset(c.cast(c.byref(sa, sigaction_t.sa_mask.offset), c.POINTER(c.c_int)))
print(sa.sa_mask.value)