目录
unlocked_ioctl与ioctl接口
- 这两个是一样的,功能和对应的系统调用均没有发生变化
- 当调用的时候也会调用文件操作结构体中的函数,和read和write一样
与read/write的区别
- 两则都可以让应用层与内核通信,传输数据
- read只能读取,write只能写,
- ioctl函数可以读写,但读取大数据的时候会变低
接口命令规则
- 包含32位,分为四个分区,每个分区不一样
- 0-7:命令的编号,0-255
- 8-15:命令的的幻数
- 0-15主要目的是区分命令,只有全部一样的才是同一个命令
- 16-29:存放传递数据的大小
- 30-31:读写的方向
- 00:用户和驱动没有通信
- 10:用户从驱动读数据
- 01:用户从驱动写数据
- 11:先写数据到驱动再读
合成宏
_IO(type,nr) //定义没有数据传递的命令
_IOR(type,nr,size)//定义从驱动中读取数据的命令
_IOW(type,nr,size)//定义向驱动写入数据的命令
_IOWR(type,nr,size)//定义数据交换类型的命令,先写入数据,再读取数据这类命令
- 参数:
- type:幻数,8-15位
- nr:编号,0-7位
- size:大小,不是数字,是类型,int....
分解宏
_IOC_DIR(nr)//分解命令的方向,也就是上面说 30~31位的值
_IOC_TYPE(nr)//分解命令的幻数,也就是上面说 8~15 位的值
_IOC_NR(nr)//分解命令的编号,也就是上面说 0~7位
_IOC_SIZE(nr)//分解命令的复制数据大小,也就是上面说的 16~29 位
- 参数:
- nr:要分解的命令
示例
- 加入头文件#include <sys/ioctl.h>
- 定义命令
- 在main函数中分解命令打印分区
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #define CMD_TEST0 _IO('L',0) #define CMD_TEST1 _IO('L',1) #define CMD_TEST2 _IOW('L',3,int) #define CMD_TEST3 _IOR('L',3,int) int main(int argc,char *argv[]) { printf("30-31 is %d",_IOC_DIR(CMD_TEST0)); printf("30-31 is %d",_IOC_DIR(CMD_TEST3)); printf("7-15 is %c",_IOC_TYPE(CMD_TEST0)); printf("7-15 is %c",_IOC_TYPE(CMD_TEST1)); printf("0-7 is %d",_IOC_NR(CMD_TEST2)); return 0; }