计算fnctl.ioctl的opt参数的函数

ioctl-opt的Python项目详细描述


pythonified linux asm-generic/ioctl.h

所以您可以复制驱动程序的代码计算fcntl.ioctlopt参数。

例如,从以下IOCTL声明(取自input.h)开始:

#include<sys/ioctl.h>
#define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */

你可以写下:

fromioctl_optimportIOC,IOC_READEVIOCGNAME=lambdalength:IOC(IOC_READ,ord('E'),0x06,length)

差别很小,都来自python语言或编码风格:

  • ioctl_opt开始使用的宏/常量,不能以下划线开头
  • 定义的宏变为可调用的(这里是lambda,可以是函数)
  • IOCnr参数必须是整数,因此C的单引号字符变成了ord调用
  • 避免隐藏内置len函数

然后,您可能需要编写pythonic函数来方便地访问该ioctl:

importctypesimportfcntldefgetDeviceName(fd,length=1024):name=(ctypes.c_char*length)()actual_length=fcntl.ioctl(fd,EVIOCGNAME(length),name,True)ifactual_length<0:raiseOSError(-actual_length)ifname[actual_length-1]==b'\x00':actual_length-=1returnname[:actual_length]

定义hidraw ioctl的更高级示例,需要结构(有关如何定义结构的更多信息,请查看python版本的ctype文档):

importctypesfromioctl_optimportIOR,IOC,IOC_READ,IOC_WRITE# hid.hHID_MAX_DESCRIPTOR_SIZE=4096# hidraw.hclasshidraw_report_descriptor(ctypes.Structure):_fields_=[('size',ctypes.c_uint),('value',ctypes.c_ubyte*HID_MAX_DESCRIPTOR_SIZE),]classhidraw_devinfo(ctypes.Structure):_fields_=[('bustype',ctypes.c_uint),('vendor',ctypes.c_short),('product',ctypes.c_short),]HIDIOCGRDESCSIZE=IOR(ord('H'),0x01,ctypes.c_int)HIDIOCGRDESC=IOR(ord('H'),0x02,hidraw_report_descriptor)HIDIOCGRAWINFO=IOR(ord('H'),0x03,hidraw_devinfo)HIDIOCGRAWNAME=lambdalength:IOC(IOC_READ,ord('H'),0x04,length)HIDIOCGRAWPHYS=lambdalength:IOC(IOC_READ,ord('H'),0x05,length)HIDIOCSFEATURE=lambdalength:IOC(IOC_WRITE|IOC_READ,ord('H'),0x06,length)HIDIOCGFEATURE=lambdalength:IOC(IOC_WRITE|IOC_READ,ord('H'),0x07,length)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Clojure关键字在内存中的大小是多少?   Java中有固定长度的通用数组对象吗?   PostgreSQL:通过Java更新我的用户表   错误:使用java解析xml   java Json显示列表中对象的名称   java比较JodaTime时区   与JAVA中的API和包的区别?   java的int值在for循环中不改变   谷歌应用引擎中的java RSA   迁移到spring 5后出现java非法字符错误   java Websphere管理控制台不工作   JavaGSON如何始终在json中包含毫秒?   带有空格和双引号的windows Java ProcessBuilder命令参数失败   java错误:重复的zip条目[43.jar:org/apache/http/annotation/NotThreadSafe.class]