ioctl函数介绍

LINUX socket SIOCOUTQ获取发送队列信息 在某C/S结构程序测试时发现一个问题当无线网络拥塞的时候,无线层丢包很严重,TCP socket可能需要若干秒(worst case n>5)才能发出去。发送方调用write(fd)将报文发送的时候实际上只是写入了内核的write buffer。接收方什么时候能收到报文是个未知数。在某些需要同步状态机的地方,发送方最好能够确认接收方收到报文后再进行下一步动作。C: How to tell t... 阅读详情
	我这里说的ioctl函数是在驱动程序里的,因为我不知道还有没有别的场合用到了ioctl,
所以就规定了我们讨论的范围。为什么要写篇文章呢,是因为我前一阵子被ioctl给搞混
了,这几天才弄明白它,于是在这里清理一下头脑。

一、 什么是ioctl。
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就
是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数
如下:
int ioctl(int fd, ind cmd, …);
其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设
备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和
cmd的意义相关的。
ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支
持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。

二、 ioctl的必要性
如果不用ioctl的话,也可以实现对设备I/O通道的控制,但那就是蛮拧了。例如,我们可
以在驱动程序中实现write的时候检查一下是否有特殊约定的数据流通过,如果有的话,
那么后面就跟着控制命令(一般在socket编程中常常这样做)。但是如果这样做的话,会
导致代码分工不明,程序结构混乱,程序员自己也会头昏眼花的。
所以,我们就使用ioctl来实现控制的功能。要记住,用户程序所作的只是通过命令码告
诉驱动程序它想做什么,至于怎么解释这些命令和怎么实现这些命令,这都是驱动程序要
做的事情。

三、 ioctl如何实现
这是一个很麻烦的问题,我是能省则省。要说清楚它,没有四五千字是不行的,所以我这
里是不可能把它说得非常清楚了,不过如果有读者对用户程序怎么和驱动程序联系起来感
兴趣的话,可以看我前一阵子写的《write的奥秘》。读者只要把write换成ioctl,就知
道用户程序的ioctl是怎么和驱动程序中的ioctl实现联系在一起的了。
我这里说一个大概思路,因为我觉得《Linux设备驱动程序》这本书已经说的非常清楚
了,但是得化一些时间来看。
在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对
应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事
情,因为设备都是特定的,这里也没法说。关键在于怎么样组织命令码,因为在ioctl中
命令码是唯一联系用户程序命令和驱动程序支持的途径。
命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,这样才不
会将正确的命令发给错误的设备,或者是把错误的命令发给正确的设备,或者是把错误的
命令发给错误的设备。这些错误都会导致不可预料的事情发生,而当程序员发现了这些奇
怪的事情的时候,再来调试程序查找错误,那将是非常困难的事情。
所以在Linux核心中是这样定义一个命令码的:
____________________________________
| 设备类型 | 序列号 | 方向 |数据尺寸|
|----------|--------|------|--------|
| 8 bit | 8 bit |2 bit |8~14 bit|
|----------|--------|------|--------|

这样一来,一个命令就变成了一个整数形式的命令码。但是命令码非常的不直观,所以
Linux Kernel中提供了一些宏,这些宏可根据便于理解的字符串生成命令码,或者是从
命令码得到一些用户可以理解的字符串以标明这个命令对应的设备类型、设备序列号、数
据传送方向和数据传输尺寸。

这些宏我就不在这里解释了,具体的形式请读者察看Linux核心源代码中的和,文件里给
除了这些宏完整的定义。这里我只多说一个地方,那就是"幻数"。
幻数是一个字母,数据长度也是8,所以就用一个特定的字母来标明设备类型,这和用一
个数字是一样的,只是更加利于记忆和理解。就是这样,再没有更复杂的了。
更多的说了也没有,读者还是看一看源代码吧,推荐各位阅读《Linux 设备驱动程序》所
带源代码中的short一例,因为它比较短小,功能比较简单,可以看明白ioctl的功能和细
节。

四、 cmd参数如何得出
这里确实要说一说,cmd参数在用户程序端由一些宏根据设备类型、序列号、传送方向、
数据尺寸等生成,这个整数通过系统调用传递到内核中的驱动程序,再由驱动程序使用解
码宏从这个整数中得到设备的类型、序列号、传送方向、数据尺寸等信息,然后通过
switch{case}结构进行相应的操作。
要透彻理解,只能是通过阅读源代码,我这篇文章实际上只是一个引子。Cmd参数的组织
还是比较复杂的,我认为要搞熟它还是得花不少时间的,但是这是值得的,驱动程序中最
难的是对中断的理解。

五、 小结
ioctl其实没有什么很难的东西需要理解,关键是理解cmd命令码是怎么在用户程序里生成
并在驱动程序里解析的,程序员最主要的工作量在switch{case}结构中,因为对设备的
I/O控制都是通过这一部分的代码实现的。

参考资料:
1.《Linux 设备驱动程序》,鲁宾尼著,中国电力出版社。
2.《write的奥秘》,coly,真情流露(202.204.7.235)->电脑技术->Linux技术。
 
普通人如何上岸华为OD-面试总结 总共有3道算法题,100分值的两道,200分值的一道,不同的毕业院校和专业,通过机试的分值不一样,最少需要150分通过,提前和hr联系,了解自己需要多少分通过。重中之重:哪怕你是背的题库,也请你一定不要直接抄原来的,最好是变更下方法名,否则会判定你重复率过高,从而失去后面的面试机会(实在是不会做再用此方法,凑分数所用,面试官能看到你的代码,会影响你的面试评价)本人女,所以还问道了婚育计划,有对象这点可以说,没有问题,但是如果可以的话,生孩子的时间,可以给hr说这几年不考虑。如果说没有难题,直接就挂了。 阅读详情

相关推荐

机械臂电机力矩计算

设计 6 轴机械臂时,电机力矩计算是确保机械臂负载能力、运动精度和安全性的核心环节,需围绕和两大核心展开,结合机械臂结构参数(如关节长度、质量分布)、负载需求(如末端负载重量、惯性)和运动参数(如加速度、角速度)逐步推导。

ZPC8210的博客 1856

关于驱动程序中的ioctl 作者:coly(李勇)

关于驱动程序中的ioctl 作者:coly(李勇)   来源:linuxforum    更新日期:2004-12-04 简述:ioctl的简单介绍 关于驱动程序中的ioctl coly(李勇)

吴垠的专栏 3022

【提示学习代码】CoOp代码详读

CoOp是对CLIP的改进工作,主要是对prompt进行学习从而不用来手动设置prompt。自定义CLIP模型:上述两个模块结合而成的CLIP。文本编码器,接收文本的输入,并输出相应的编码表示。将图像和文本进行编码并计算它们之间的相似性。permute后变成了(4,2,3)Prompt学习器,用于学习生成提示。

weixin_51293984的博客 5816

linux命令设置波特率,linux下非标准波特率的设置和使用

通常,在linux下面,设置串口使用终端IO的相关函数设置,如tcsetattr等函数,linux内部有一个对常用波特率列表的索引,根据设置的波特率用底层驱动来设置异步通信芯片的寄存器对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL, p)和ioctl(fd, TIOCSSERIAL, p)的配合,ioctl的最后一个参数是struct serial_struct *类型,在...

weixin_39673947的博客 1235

OKCC呼叫中心部署实战指南:从零搭建高效外呼系统

本文提供OKCC呼叫中心系统的完整部署实战指南,从服务器选型、操作系统准备到详细安装步骤和性能优化,帮助企业从零搭建高效外呼系统。重点介绍FreeSWITCH核心组件的安装配置技巧,以及常见问题排查方法,助力企业提升客户服务效率。

weixin_29275257的博客 163

JHU ICBM DTI Atlas纤维束模板介绍

JHU ICBM DTI atlas 纤维束的定位与功能介绍

machinelearning_er的博客 6423

ioctl socket buffer

ioctl在socket中的一些用法及示例 函数 : ioctl(int fd, int request, void * arg) 定义 :  功能 : 控制I/O设备, 提供了一种获得设备信息和向设备发送控制参数的手段. 参数 : int  fd      文件句柄. 用于socket时, 是socket套接字.        int  request 函数定义的所有操作. 关于socket的...

MyObject-C的专栏 1020

招行收款通SM2加密解密全流程解析:PHP开发者必看

本文详细解析了招商银行收款通服务中SM2加密解密的完整流程,特别针对PHP开发者提供了从密钥管理到签名验签的实战指南。涵盖国密算法基础、PHP环境配置、密钥安全存储及生产环境优化方案,帮助开发者快速实现高安全性的支付系统集成。

weixin_30632089的博客 651

构造IOCTL命令的学习心得-----_IO, _IOR, _IOW, _IOWR 幻数的理解

在编写ioctl代码之前,需要选择对应不同命令的编号。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非串行设备输入流修改波特率,如果每一个ioctl命令都是唯一的,应用程序进行这种操作时就会得到一个EINVAL错误,而不是无意间成功地完成了意想不到的操作。         在驱动程序里, ioc

博客模版 4万+

AI在生物学领域的应用:基因序列分析和人工智能生物学

好的,非常感谢您提供的这个精彩的主题和详细的要求。我会全力以赴,遵循您的要求写一篇内容丰富、结构清晰、论述深入的专业技术文章。现在,就让我们开始这篇关于"AI在生物学领域的应用:基因序列分析和人工智能生物学"的博客文章吧! 1. 背景介绍 1.1 生物信息学的兴起

AI天才研究院 1413

npm install failed如何办?

上网搜索,说是网络配置不太对。按照如下几步,保证解决问题。在运行npm install指令时,出现如下错误。

xiezhipu的博客 879

linux ioctl函数介绍

1. 概念 ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。 在文件 I/O 中,ioctl 扮演着重要角色,本文将以驱动开发为侧重点,从用户空间到内核空间纵向分析 ioctl 函数。 2. 用户空间 ioctl #include <sys/ioctl.h> int ioctl(int fd, int cmd, ...) ; 参数 描述

hairuiJY 5738

手把手教你学Simulink--基于Simulink的移相全桥DC-DC变换器仿真建模

特点高效性:通过实现零电压开关(ZVS)减少开关损耗。电气隔离:使用变压器提供输入输出间的电气隔离。适用于中高功率应用:如服务器电源、工业电源等。挑战控制复杂度:精确控制相位差以实现软开关。元件选择:合适的电感、电容值对于性能至关重要。动态响应:快速响应负载变化,保持稳定的输出电压。首先明确要模拟的任务内容。设计一个能够支持特定输入输出电压比的PSFB变换器。根据工作频率和谐振元件值确定合适的电路参数。实现有效的控制策略来维持输出电压稳定,并实现软开关。

MHD0815的博客 518

linux系统调用之 ioctl 函数介绍

1. ioctl为什么会出现 虽然在文件操作结构体 “struct file_operations” 中有很多对应的设备操作函数,但是有些命令是实在找不到对应的操作函数。如CD-ROM的驱动,想要一个弹出光驱的操作,这种操作并不是所有的字符设备都需要的,所以文件操作结构体也不会有对应的函数操作。 大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能力,用户程序所作的只是通过...

w741627265的博客 1906

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ioctl函数使用方法介绍

本函数影响由fd参数引用的一个打开的文件。 #include#includeint ioctl( int fd, int request, .../* void *arg */ );返回0:成功    -1:出错 第三个参数总是一个指针,但指针的类型依赖于request参数。我们可以把和网络相关的请求划分为6类:套接口操作文件操作接口操作ARP高速缓

heiniaoyuyouling的专栏 2546

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ioctl函数的参数介绍

IPv4 和 IPv6 的网络接口操作使用套接字 ioctl 命令文档选项<!--document.write(打印本页);//-->打印本页<!--document.write(将此页作为电子邮件发送);//-->

weixiuc的专栏 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IOCtl()函数介绍

我这里说的ioctl函数是在驱动程序里的,因为我不知道还有没有别的场合用到了ioctl, 所以就规定了我们讨论的范围。为什么要写篇文章呢,是因为我前一阵子被ioctl给搞混 了,这几天才弄明白它,于是在这里清理一下头脑。 一、 什么是ioctl。 ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,

dreamer2015的专栏 321

Linux之socket编程:ioctl函数介绍(ifconfig例子)

ioctl函数一直作为那些不适合归入其他精细定义类别的特性的系统接口(即特殊的接口),POSIX一直致力拜托处于标准化过程中的特定功能的ioctl接口,如使用新的函数sockatmark函数取代SIOCATMARK,但是与网络相关并且依赖于实现的特性保留的ioctl请求为数依然不少,主要用于获取接口信息、访问路由表、访问ARP高速缓存等等。 函数的原型如下,其中返回0表示成功,返回-1表示失败。r...

Linux 5983

dup,dup2复制文件描述符,ioctl函数介绍,fcntl函数详解,阻塞模式和非阻塞模式介绍

dup,dup2复制文件描述符,ioctl函数介绍,fcntl函数详解,阻塞模式和非阻塞模式介绍

cyz322649的博客 1974

[Linux驱动开发五]实现ioctl函数

前文已经实现了对字符设备的具体读写功能,但如果我们想要驱动外设,不仅需要具备读写设备的能力,还需要具备对它的控制能力。例如,要求设备报告错误信息,改变波特率,LED灯的点亮或熄灭等,这些都需要通过ioctl()来实现。

weixin_42857944的博客 2992

linux 内核 - ioctl 函数详解

linux 内核 - ioctl 函数详解 1. 概念 ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。 在文件 I/O 中,ioctl 扮演着重要角色,本文将以驱动开发为侧重点,从用户空间到内核空间纵向分析 ioctl 函数。 2. 用户空间 ioctl #include <sys/ioctl.h> int ioctl(int fd, int cm

JCfyw的博客 5180

设备驱动与 ioctl 函数详细分析

类 UNIX 操作系统将所有设备都看成文件 每个设备都对应一个文件,在内核中也有一个相应的索引结点 对文件操作的系统调用也适用于对设备文件的操作,例如 open() 设备文件逻辑空间是一个线性空间 ioctl 是设备驱动程序中对设备的 I/O 通道进行管理的函数,简言之就是对设备的一些特性进行管理,例如传感器的数据采集、串口波特率等等。 上图1清晰的表明了 ioctl 在各个层之间的调用关系...

个人笔记 2722

ioctl函数

一、什么是ioctl   ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。   ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数来控制设备的I/O通道。   用户程序所作的只是通过命令码(cmd)告诉驱动程序它想...

qq_42655404的博客 1万+
上一篇: Linux 下串口通讯编程
下一篇: C中常用宏定义
Humwen
博客等级 码龄22年 7粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值