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;	
}
版权声明:本文为qq_28812525原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28812525/article/details/105449682

智能推荐

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: ...

猜你喜欢

015_swiftui_刘海屏适配

swiftUi创建的视图是默认在刘海屏幕的安全区域以内的。 之前我们设置图片也用到了这个个属性。 现在我们再来使用下吧 下面就是图片了。 ...

大数据入门: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框没有样式, 查阅...