Python中的C_IOR函数的等价物是什么?
我最近正在编写一些C代码并将其“翻译”成Python,但却被一个名为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)) “钥匙
\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)