Python fcntl.ioctl()的64位参数

Python fcntl.ioctl()的64位参数,python,ioctl,Python,Ioctl,在我的Python(2.7.3)代码中,我尝试使用ioctl调用,接受长int(64位)作为参数。我使用的是64位系统,因此64位int与指针的大小相同 我的问题是Python似乎不接受64位int作为fcntl.ioctl()调用的参数。它乐于接受32位int或64位指针-但我需要的是传递64位int。 这是我的ioctl处理程序: static long-triple\u-driver\u-ioctl(结构文件*filp,unsigned-int-cmd,unsigned-long-arg)

在我的Python(2.7.3)代码中,我尝试使用ioctl调用,接受长int(64位)作为参数。我使用的是64位系统,因此64位int与指针的大小相同

我的问题是Python似乎不接受64位int作为fcntl.ioctl()调用的参数。它乐于接受32位int或64位指针-但我需要的是传递64位int。

这是我的ioctl处理程序:

static long-triple\u-driver\u-ioctl(结构文件*filp,unsigned-int-cmd,unsigned-long-arg)
{
长误差=0;
开关(cmd)
{
案例1234:

printk(“==(%u)驱动程序得到arg%lx;arg这是否可以使用Python的
fcntl.ioctl()

…在我的系统上,
/usr/include/limits.h
告诉我

#  define INT_MAX   2147483647
…大概是
(2**((sizeof(int)*8)-1))-1

因此,除非您使用的系统
sizeof(int)
至少
8
,否则您必须直接使用模块调用底层C函数,但它是特定于平台的

假设Linux,像这样的东西应该可以工作

from ctypes import *

libc = CDLL('libc.so.6')

fd = os.open (DEV_NAME, os.O_RDWR, 0666)
value = c_uint64(0xffff<<32)
libc.ioctl(fd, 5678, value)
从ctypes导入*
libc=CDLL('libc.so.6')
fd=os.open(DEV_NAME,os.O_RDWR,0666)

value=c_uint64(0xffffPython的
ioctl
中的“arg”符号与c的符号不同

在python中(同样根据),它要么是python整数(不指定32位或64位),要么是某种缓冲区对象(如字符串)。python中实际上没有“指针”(因此所有底层架构细节,如32位或64位地址都完全隐藏)

如果我理解正确,您需要的实际上是一个
SET\u VAL
is
struct.pack(您的64位整数)
,首先将该字符串传递给ioctl,而不是直接传递整数

像这样:


如果可能的话,
struct.pack('>Q',1将有助于提供一个可复制的示例
调用是特定于设备的,用
IOC\u GET\u VAL
替换您正在使用的实际请求代码会使测试变得困难。@Aya:谢谢您的评论。我是设备驱动程序新手,在构造一个简单但功能性强的示例时遇到一些困难。但我会看看我能做些什么。:)同时,我发布了一个基于
ctypes
的解决方案。好了,我开始发布一个更清晰的示例!我现在将对答案进行分析…我找到了一个更简单的测试方法,使用
strace(1)
,在重新检查Python的源代码后,可能无法使用
fcntl
模块。另请参阅我的更新答案。很抱歉,这是不正确的。(如果我的原始帖子不够清晰,那么很抱歉。)据我所知,struct.pack()的任何使用都会转换(在c驱动程序中)指向发送到c的ioctl参数的二进制数据的指针。我不想要指针;我想要直接控制传递的64位值。但严格来说,您不能通过32位参数传递任何64位值(无论是指针还是“值”)。在32位体系结构中,ioctl调用中的参数类型将是32位。在64位系统上,所有内容都变为64位,所以理论上可以在C*中将64位值传递给ioctl。另一方面,Python尝试隐藏这些平台细节,所以它不公开任何指针API。其思想是,您永远不要关心体系结构是什么。事实上,Python的整数可以是任意大的(即不受64位或任何限制…),因此保持Pythonic(和平台无关)传递缓冲区对象可能更好,即使是64位整数之类的小东西……是的,但这不是这个特定的现有ioctl调用的实现方式。ioctl的参数可以被视为指针或整数;这就是为什么python提供了从传递整数开始的选项。是的!这是有效的:)我很惊讶fcntl.ioctl()中没有内置支持,但这是一个非常合理的解决方法。cf..回答得很好。非常感谢:D@Ziv是的。我当时的印象是(出于某种原因)一个
int
应该与CPU寄存器大小相同,但事实并非如此。
#  define INT_MAX   2147483647
from ctypes import *

libc = CDLL('libc.so.6')

fd = os.open (DEV_NAME, os.O_RDWR, 0666)
value = c_uint64(0xffff<<32)
libc.ioctl(fd, 5678, value)