Python中的C_IOR函数的等价物是什么?

Python中的C_IOR函数的等价物是什么?,python,c,ioctl,Python,C,Ioctl,我最近正在编写一些C代码并将其“翻译”成Python,但却被一个名为\u IOR的特定函数卡住了。它在sys/ioctl.h中定义如下: #define _IOC(inout,group,num,len) \ (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num)) #define _IOR(g,n,t) _IOC(IOC_OUT, (g), (n), sizeof(t)) “钥匙

我最近正在编写一些C代码并将其“翻译”成Python,但却被一个名为
\u IOR
的特定函数卡住了。它在
sys/ioctl.h
中定义如下:

#define _IOC(inout,group,num,len) \
    (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num))
#define _IOR(g,n,t) _IOC(IOC_OUT,   (g), (n), sizeof(t))
“钥匙”电话是我需要做的。看起来它在对字符串执行位操作

我设法找到了与上面相同的Python代码,但它只适用于单个字符

_IOC_NRBITS   =  8
_IOC_TYPEBITS =  8
_IOC_SIZEBITS = 14
_IOC_DIRBITS  =  2

_IOC_NRSHIFT = 0
_IOC_TYPESHIFT =(_IOC_NRSHIFT+_IOC_NRBITS)
_IOC_SIZESHIFT =(_IOC_TYPESHIFT+_IOC_TYPEBITS)
_IOC_DIRSHIFT  =(_IOC_SIZESHIFT+_IOC_SIZEBITS)

_IOC_NONE = 0
_IOC_WRITE = 1
_IOC_READ = 2
def _IOC(direction,type,nr,size):
    return (((direction)  << _IOC_DIRSHIFT) |
        ((type) << _IOC_TYPESHIFT) |
        ((nr)   << _IOC_NRSHIFT) |
        ((size) << _IOC_SIZESHIFT))
def _IOR(type, number, size):
    return _IOC(_IOC_READ, type, number, size)
但我不知道第二次呼叫的“钥匙”是什么意思。有没有一种方法可以在Python中执行下面的C调用

_IOR('keys', 1, unsigned char *)

在char*上运行得到的数字不能保证是任何特定的数字。在计算
键的IOR时,宏将字符串的地址视为整数。结果将根据
在堆栈中的位置而变化。因此,在Python中,这一功能确实没有很好的替代品

从:

g
指定此ioctl类型所属的组。这一论点必须得到证实 是一个非负8位数字(即在0-255范围内)。 如果有新的ioctl组,则可以将值零(0)传递给此参数 没有被定义

该函数的预期用途是将字节作为第一个参数(通过字符或整数类型)。也就是说,“钥匙”可能被分配到了某个随机的小组。我会选择一个您认为尚未加入的组(或者在您的C代码中查找当前分配给它的组,并使用该编号)来代替

或者,您可以始终只使用输入字符串的第一个字符,并将其作为组id

def _IOR(group, number, size):
    if isinstance(group, basestring):
        group = ord(group[0]) if group else 0
    return _IOC(_IOC_READ, group, number, size)

然后
\u IOR('t',3,1)
\u IOR('keys',1,1)
仍将运行,尽管组分配与C宏不同。但由于宏被误用于
赋值,我认为这不会有问题。

是一个整数字符常量(包含四个字符),其值由实现定义。您声明C代码
\u IOR('keys',1,unsigned char*)
返回的值是-444763391,作为一个4字节的十六进制数,它是0xE57D7301。由此我们可以得出结论,在第二个示例中,此实现从
'k'计算
'keys'
的整数值0x6B657973。宏是否将某些堆栈常量'keys'的地址oring到结果中?看起来宏不是为了计算char*…它肯定是在字符串键上执行的,尽管我不确定如何执行;它甚至可以编译和运行!我链接到的线程中的一点背景;这是供应商提供的示例:。它给了我一个神奇的数字——444763391,我正在试图弄清楚如何使用它,而不是硬编码;而是包含多个字符的整数字符常量。
_IOR('keys', 1, unsigned char *)
def _IOR(group, number, size):
    if isinstance(group, basestring):
        group = ord(group[0]) if group else 0
    return _IOC(_IOC_READ, group, number, size)
2<<30|4<<16|'keys'<<8|1
:     :     :         :
:     :     :         1 = num n
:     :     'keys' = group g
:     4 = sizeof (unsigned char *)
2 = _IOC_READ
_IOR(ord('e')<<16|ord('y')<<8|ord('s'), 1, 4)