python - Python 中的 C _IOR 函数等效于什么?

标签 python c ioctl

我最近looking在一些 C 代码和“翻译”到 Python 但卡在一个名为 _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))

我看到它以这些方式调用:

_IOR('t', 3, int)
_IOR('keys', 1, unsigned char *)

'keys' 调用是我需要做的。看起来它正在对字符串进行按位运算。

我设法找到了与上述等效的 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)

这适用于单字符调用。

_IOR(ord('t'), 3, 1)

但我不知道第二次调用“键”的等效项。有没有办法在 Python 中执行下面的 C 调用?

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

最佳答案

'keys'是一个整数字符常量(包含四个字符),其值是实现定义的。您声明 C 代码返回的值 _IOR('keys', 1, unsigned char *)是 -444763391,即 4 字节十六进制数 0xE57D7301。由此我们可以得出结论,此实现计算了 'keys' 的整数值 0x6B657973。来自 'k'<<24|'e'<<16|'y'<<8|'s' . _IOR值 0xE57D7301 来自表达式

2<<30|4<<16|'keys'<<8|1
:     :     :         :
:     :     :         1 = num n
:     :     'keys' = group g
:     4 = sizeof (unsigned char *)
2 = _IOC_READ

- 请注意,只有 8 位保留用于 TYPE(组)值,这种创造性地使用 32 位值使得 TYPE 溢出到 SIZE 和 DIR 位(与它们进行或运算)及其最高有效字节(来自 'k'<<24 ) 甚至被移出 int值(value)。

使用 Python 函数,您可以通过调用计算相同的值

_IOR(ord('e')<<16|ord('y')<<8|ord('s'), 1, 4)

(因为 k 丢失了,我们可以直接放弃它)。

关于python - Python 中的 C _IOR 函数等效于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20500947/

相关文章:

c - 声明存储类的变量

C 预处理器 : Evaluate macro early

windows - 如何加载并启动Windows驱动程序?

python - matplotlib.pyplot - 仅修复一个轴限制,将其他设置为自动

python - 关于Python中的rpm模块

C 编译警告 : passing argument 1 of ‘insert’ from incompatible pointer type [enabled by default]

linux - "error: unknown field ‘compat_ioctl’ 在初始化程序中指定“同时创建虚拟 ioctl

c++ - 如何让 C++ 中的 ioctl 只管理我鼠标的 4 个按钮中的 2 个?

python - 在数据帧python中找到并加上不足的日期时间

java - 为什么 Java 和 Python 的垃圾回收方法不同?