gpt4 book ai didi

python - ioctl 数字与 C ioctl 数字不同吗?

转载 作者:行者123 更新时间:2023-12-01 05:58:30 26 4
gpt4 key购买 nike

据我所知,ioctl 数字由驱动程序明确定义并在内核中注册。

我正在使用 python 中的一些代码来查询操纵杆状态。我已阅读this doc about joystick api , this doc about ioctl numbers ,和this one from python fcntl module .

我创建了一个 C 程序来测试和查询值,并使用我使用的代码进行 python 测试 from here用于实现 _IOR() C 宏。

内核驱动定义:

monolith@monolith ~/temp $ grep JSIOCGAXES /usr/include/* -r
/usr/include/linux/joystick.h:#define JSIOCGAXES _IOR('j', 0x11, __u8)

C 程序

#include <stdio.h>
#include <linux/joystick.h>
#include <fcntl.h>

int main() {
int fd = open("/dev/input/js0", O_RDONLY);
printf("Ioctl Number: (int)%d (hex)%x\n", JSIOCGAXES, JSIOCGAXES);
char number;
ioctl(fd, JSIOCGAXES, &number);
printf("Number of axes: %d\n", number);
close(fd);
return 0;
}

C 程序输出:

monolith@monolith ~/temp $ ./test 
Ioctl Number: (int)-2147390959 (hex)80016a11
Number of axes: 6

Python 输出

# check if _IOR results in the used ioctl number in C
>>> _IOR(ord('j'), 0x11, 'c')
-2147390959
>>> file = open("/dev/input/js0")
# use that integer
>>> fcntl.ioctl(file, -2147390959)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 14] Bad address
# ask what hex value is
>>> "%x" % -2147390959
'-7ffe95ef'
# WHY THIS HEX CONVERSION DIFFERS?
>>> fcntl.ioctl(file, -0x7ffe95ef)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 14] Bad address
# Use the hex value from the C program output
>>> fcntl.ioctl(file, 0x80016a11)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 14] Bad address

有什么想法为什么我无法使用该 ioctl 编号查询文件描述符吗? ioctl() 和 fcntl() 函数采用文件描述符或实现了 fileno() 方法的对象,因此我从文件对象。

也许问题出在数字转换和类型上,不知道......线索?

最佳答案

这一切都归结为十六进制转换不同 - 将十六进制 C 插入 Python 会得到不同的数字:

>>> 0x80016a11
2147576337

我不确定为什么 Python 和 C 给出不同的十六进制,但它可能至少部分与符号相关 - Python 的 '%x' 给出一个有符号 十六进制值1 , printfs 给出无符号 2 .

使用 Python 的十六进制值 (-7ffe95ef) 可能会有所改善 - 或者更好的是,像在 C 中那样使用变量并避免出现转换错误:

op = _IOR(ord('j'), 0x11, 'c')
...
fcntl.ioctl(file, op)

关于python - ioctl 数字与 C ioctl 数字不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11482468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com