_IO(), _IOR(), _IOW(), _IOWR() 宏的用法与解析
2016-04-22 12:42
411 查看
在Linux驱动程序里, ioctl() 函数上传送的 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。在Linux里面应用了很多宏来定义,我在这里只是翻译成简单易懂的,直接用数字代替宏。
这个30位的数字的位描述:
生成命令的宏7个:
解析命令宏4个:
特殊宏5个:
这个30位的数字的位描述:
生成命令的宏7个:
#define _IO(type,nr) (0<<30 | 0<<16 | type<<8 | nr<<0) #define _IOW(type,nr,size) (1<<30 | sizeof(size)<<16 | type<<8 | nr<<0) #define _IOR(type,nr,size) (2<<30 | sizeof(size)<<16 | type<<8 | nr<<0) #define _IOWR(type,nr,size) (3<<30 | sizeof(size)<<16 | type<<8 | nr<<0) #define _IOW_BAD(type,nr,size) (1<<30 | sizeof(size)<<16 | type<<8 | nr<<0) #define _IOR_BAD(type,nr,size) (2<<30 | sizeof(size)<<16 | type<<8 | nr<<0) #define _IOWR_BAD(type,nr,size) (3<<30 | sizeof(size)<<16 | type<<8 | nr<<0)
解析命令宏4个:
#define _IOC_DIR(nr) ( (nr>>30) & 0x3) #define _IOC_TYPE(nr) ( (nr>>8) & 0xFF) #define _IOC_NR(nr) ( (nr>>0) & 0xFF) #define _IOC_SIZE(nr) ( (nr>>16) & 0x3FFF)
特殊宏5个:
#define IOC_IN 0x40000000 #define IOC_OUT 0x80000000 #define IOC_INOUT 0xC0000000 #define IOCSIZE_MASK 0x3FFF0000 #define IOCSIZE_SHIFT 16
生成命令例1
解析过程和生成命令类似,只是一个反逻辑!这里就不多解释了。
相关文章推荐
- iOS 远程推送通知
- 在Logcat中增加kernel打印
- linux解压覆盖命令
- Ubuntu配置JDK
- ps查找进程,kill杀死进程
- 冒泡排序
- MMORPG服务器架构
- Intent
- 线程的生命周期
- Matlab调试功能详解
- 苹果iTunes电影和iBooks商店被中国关闭
- 苹果iTunes电影和iBooks商店被中国关闭
- R语言︱H2o深度学习的一些R语言实践——H2o包
- shell脚本中一些特殊符号
- [LeetCode] Reverse String 翻转字符串
- windows服务(installutil.exe)报错。异常来自 HRESULT:0x80131515
- Best Time to Buy and Sell Stock
- python解析pcap转储为sqlite
- 【图像处理】基本的全局图像灰度变换
- EF linq多表查询统计demo