linux应用编程:I/O操作的杂货箱 ioctl
标签: linux应用开发
一、概述
- ioctl 为什么会称为I/O操作的杂货箱?那时因为不能用之前 文件I/O 操作的地方,通常都能用ioctl来进行操作。
- 下面看ioctl 从应用到驱动的操作机制(网络截图)

- 从上面可以看出,ioctl通过cmd命令和传入arg的方式来进行文件的特殊操作,此机制的应用往往体现在应用程序对硬件设备的控制上面(比如设置串口的波特率、点击电机转速、控制LCD屏等)
- 本文只讨论应用层相关的ioctl,内核层请看后面章节。
二、应用层接口
#include <sys/ioctl.h>
/* @function 文件描述符
* @param[in] request 命令cmd
* @param[in] ... 一般用与传递数据
* @return 成功 0, 失败 -1
*/
int ioctl(int fd, unsigned long request, ...);
- cmd :
– cmd拆分:

幻数:说得再好听的名字也只不过是个0~0xff的数,占8bit(_IOC_TYPEBITS)。就是不同组命令的区分标识,通常写入一个ASCII字符来进行区分
序数:用这个数来给自己的命令编号,占8bit(_IOC_NRBITS),我的程序从1开始排序。
数据传输方向:占2bit(_IOC_DIRBITS)。如果涉及到要传参,内核要求描述一下传输的方向,传输的方向是以应用层的角度来描述的。
1)_IOC_NONE:值为0,无数据传输。
2)_IOC_READ:值为1,从设备驱动读取数据。
3)_IOC_WRITE:值为2,往设备驱动写入数据。
4)_IOC_READ|_IOC_WRITE:双向数据传输。
数据大小:与体系结构相关,ARM下占14bit(_IOC_SIZEBITS),如果数据是int,内核给这个赋的值就是sizeof(int)。
/*完成命令的组合*/
#define _IOC(dir,type,nr,size) \
(((dir) << _IOC_DIRSHIFT) | \ /*方向位,没有方向、读、写、读写*/
((type) << _IOC_TYPESHIFT) | \ /*类型—幻数,一般填一个字符*/
((nr) << _IOC_NRSHIFT) | \ /*设备编号,一般填整数*/
((size) << _IOC_SIZESHIFT)) /*传输的数据大小*/
/*命令格式*/
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
/*完成命令的分离*/
#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) 方向位
#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) 类型
#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) 设备编号
#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) 数据大小
三、例程
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
struct dev_data
{
int a;
int b;
};
#define LED1_OFF _IOWR('L',1,struct dev_data)
#define LED1_ON _IOWR('L',1,int)
#define LED2_OFF _IOWR('L',2,char)
#define LED2_ON _IOWR('L',2,char)
struct dev_data data=
{
.a=123,
.b=456
};
int main(int argc,char **argv)
{
if (argc!=2) {
printf("用法:./app /dev/xxx!\n");
exit(-1);
}
int fd;
fd=open(argv[1],2);
if (fd<0) {
printf("驱动设备打开失败!\n");
exit(-1);
}
ioctl(fd,LED1_OFF,&data);
printf("app-->a=%d\n",data.a);
printf("app-->b=%d\n",data.b);
close(fd);
return 0;
}
智能推荐
pcap包结构&SNI字段的解析
pcap文件格式是常用的数据报存储格式,包括wireshark在内的主流抓包软件都可以生成这种格式的数据包。 文件格式: Pcap文件头(24字节)+数据包头(wireshark增加的)+数据包(网络中抓取的)+…… 1.pcap文件头结构 各字段说明: Magic:4B:0×...
MC9S12XEP100的IIC模块(IICV3)
最近在写DS3231时钟芯片的驱动,这个芯片使用IIC进行通讯,以前没有用过IIC模块,照着教材和示例程序写程序后发现各种问题。没办法,还是官方数据手册靠谱,遂把相应部分又翻译了一遍。果然发现示例程序纯粹就是个玩具,一点用都没有。。。 第15章 集成电路总线(IICV3) 译者注:译者博客(http://blog.csdn.net/lin_strong),转载请保留这条。此为 MC9S12XEP1...
Eureka服务注册与发现
文章目录 二、SpringCLoud中遇到的技术 (一)、Eureka 1、功能: 2、什么是服务治理. 3、什么是服务注册与发现 4、Eureka包含两个组件: Eureka Server和Eureka Client 5、单机Eureka构建步骤 5.1 建model:cloud-eureka-server7001 5.2 写pom 5.3 写yml 5.4 主启动类 5.5 测试 5.6 将消...
Hard Problem【HDU-3551】【一般图最大匹配 带花树】
题目链接 题意:有N个点,M条边,给出每个点的度限制,问能不能用M条边中的几条达成这个目的? 很明显的就是一个建图的问题,很明显的,少于等于度为1的,是可以直接连的,不用限制增广,而大于度为1的,需要限制增广,就可以用这样的限流的方法: ...
idea 打包 报错maven-shade-plugin:2.4.3:shade (default) on project xxx : Error creating shaded jar: null
idea 打包 报错maven-shade-plugin:2.4.3:shade (default) on project xxx : Error creating shaded jar: null 文章目录 idea 打包 报错maven-shade-plugin:2.4.3:shade (default) on project xxx : Error creating shaded jar: ...
猜你喜欢
大数据入门:Spark+Kudu的广告业务项目实战笔记(一)
1.简介 这是PK老师在Spark-SQL课程中的项目实战笔记 2.项目需求 数据ETL:原始文件为JSON格式数据,需原始文件与IP库中数据进行解析 统计各省市的地域分布情况 统计广告投放的地域分布情况 统计广告投放APP分布情况 3.项目架构 4.日志字段 5.IP规则库解析 本项目利用IP规则库进行解析,在生产中应该需要专门的公司提供的IP服务。IP规则库中的一条如下: 其中第三列是该段ip...
springBoot子项目中排除掉定义在Parent中的插件(Disable a Maven plugin defined in a parent POM)
最近在和别的项目集成,需要在我们的pom中添加上对方的parent,打包的时候就遇到了问题,对方在parent中添加了一个插件,干啥的就不说了, 反正人家是用到了, 我们是用不到,但是还给我们打包带来了一些问题。 这时候就必须排除掉对方这个插件了 1,第一种方法是 有的插件提供了不加载配置,例如: 如果不想用这个插件,就把skip标签配置成true,这样在构建的时候就不会使用这个插件了。 可是有的...
Flutter滑动隐藏头部
Flutter如何写出如下界面呢? NestedScrollView结合SliverAppBar,搞一个背景滑动放几个文字滑动还是可以玩一玩的。SliverAppBar上面显示title但是对于复杂的部件,能整死你,而去你没法解决它这个SliverAppbar的容量,那咋们自己写呗。这里我描述一下自己的做法,代码整理之后会贴出来。 一, 1. 对于滑动到顶部,TabBarView或者(法...
antd中头像上传前编辑antd-img-crop插件弹出modal没有样式的问题
在antd pro项目中,有一个头像上传前编辑的需求,在antd组件Upload中有一个上传前编辑的demo,用到一个antd-img-crop插件,用法很简单,只需要包裹Upload标签即可,具体API可以参考antd-img-crop的github地址 https://github.com/nanxiaobei/antd-img-crop 在使用过程中发现编辑弹出的modal框没有样式, 查阅...
