python-ioctl编号是否与C ioctl编号不同?

python-ioctl编号是否与C ioctl编号不同?,python,ioctl,fcntl,Python,Ioctl,Fcntl,据我所知,ioctl编号由驱动程序定义并在内核中注册 我在用python编写一些查询操纵杆状态的代码。我读过,也读过 我已经创建了一个用于测试和查询值的C程序,python使用我用于实现\u IOR()C宏的代码进行了测试 内核驱动程序定义: C程序 Python输出 #检查IOR是否导致C中使用的ioctl编号 >>>_IOR(ord('j'),0x11,'c')) -2147390959 >>>file=open(“/dev/input/js0”) #使用那个整数 >>>ioctl(文件-2

据我所知,ioctl编号由驱动程序定义并在内核中注册

我在用python编写一些查询操纵杆状态的代码。我读过,也读过

我已经创建了一个用于测试和查询值的C程序,python使用我用于实现
\u IOR()
C宏的代码进行了测试

内核驱动程序定义: C程序 Python输出
#检查IOR是否导致C中使用的ioctl编号
>>>_IOR(ord('j'),0x11,'c'))
-2147390959
>>>file=open(“/dev/input/js0”)
#使用那个整数
>>>ioctl(文件-2147390959)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
IOError:[Errno 14]地址错误
#询问十六进制值是多少
>>>“%x”%-2147390959
“-7ffe95ef”
#为什么十六进制转换不同?
>>>ioctl(文件-0x7ffe95ef)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
IOError:[Errno 14]地址错误
#使用C程序输出的十六进制值
>>>ioctl(文件0x80016a11)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
IOError:[Errno 14]地址错误
知道为什么我不能用那个ioctl号查询文件描述符吗
ioctl()
fcntl()
函数使用实现了
fileno()
方法的文件描述符或对象,因此我从
文件
对象中提取错误


可能是数字转换和类型的问题,不知道…线索?

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

>>> 0x80016a11
2147576337
我不知道为什么Python和C给出不同的十六进制,但它可能至少部分地与符号相关——Python的
'%x'
给出有符号的十六进制值,
printf
s给出无符号的十六进制值

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

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

我要回答我自己的问题

出于某种原因,使用python中的
ioctl()
获取值的唯一方法是发出以下代码:

>>> buf = array.array('h', [0])
>>> fcntl.ioctl(file.fileno(), 0x80016a11, buf)
0
>>> buf[0]
6

也就是说,使用缓冲区来保存结果。我应该重新阅读文档并理解为什么
fcntl.ioctl(file.fileno(),0x80016a11)
不起作用。

使用
fcntl.fcntl()
我得到以下错误:
溢出错误:有符号整数大于最大值
。现在我需要知道为什么C
ioctl()
正确地管理参数。C
ioctl()
int
作为参数。跟踪
int
偏移量是否是python中确定有符号整数的一种方法?关于不同的十六进制值:我认为你是对的。我已经用一些C代码进行了测试。就我的问题而言,我运气不好。似乎有一个问题,但现在应该解决。无论如何,这个问题提出的解决方案也不起作用。有更新的日期。不过,它似乎对我不起作用。我可能完全错了,但我认为这可能是因为底层ioctl系统调用没有返回任何内容,而是修改了一个特殊的结构(struct ifconf from net/if.h?)来传递它。因此,python在使用底层ioctl调用时可能也需要这样做。
# 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
>>> 0x80016a11
2147576337
op = _IOR(ord('j'), 0x11, 'c')
...
fcntl.ioctl(file, op)
>>> buf = array.array('h', [0])
>>> fcntl.ioctl(file.fileno(), 0x80016a11, buf)
0
>>> buf[0]
6