返回顶部
首页 > 资讯 > 操作系统 >怎么在Linux中使用ioctl函数
  • 376
分享到

怎么在Linux中使用ioctl函数

2023-06-13 02:06:43 376人浏览 安东尼
摘要

这期内容当中小编将会给大家带来有关怎么在linux中使用ioctl函数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  一、 什么是ioctl。  ioctl是设备驱动程序中对设备的I/O通道进行管理的函

这期内容当中小编将会给大家带来有关怎么在linux中使用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控制都是通过这一部分的代码实现的。谢谢大家的阅读,希望能帮到大家。

上述就是小编为大家分享的怎么在Linux中使用ioctl函数了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网操作系统频道。

--结束END--

本文标题: 怎么在Linux中使用ioctl函数

本文链接: https://lsjlt.com/news/264664.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么在Linux中使用ioctl函数
    这期内容当中小编将会给大家带来有关怎么在Linux中使用ioctl函数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  一、 什么是ioctl。  ioctl是设备驱动程序中对设备的I/O通道进行管理的函...
    99+
    2023-06-13
  • 怎么在linux中使用system函数
    这期内容当中小编将会给大家带来有关怎么在linux中使用system函数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。system(执行shell 命令) 相关函数 fork,execve,waitpid...
    99+
    2023-06-13
  • 怎么在Linux中使用mkdir函数
    本篇文章给大家分享的是有关怎么在Linux中使用mkdir函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。mkdir的函数原型(使用时需包含#include <sys/...
    99+
    2023-06-13
  • 怎么在Linux中使用fork()函数
    怎么在Linux中使用fork()函数?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 一、fork()函数在操作系统的基本概念中进程是程序的一次执行,且是拥有资源的最...
    99+
    2023-06-13
  • 怎么在Linux中使用split函数
    这篇文章将为大家详细讲解有关怎么在Linux中使用split函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。split函数的用法he awk function split(s,a,sep)...
    99+
    2023-06-09
  • sendmail函数与mail函数怎么在Linux中使用
    sendmail函数与mail函数怎么在Linux中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。环境  本机安装sendmail了, 但是没有启动。 其他机器上有ma...
    99+
    2023-06-13
  • c语言ioctl函数的用法是什么
    在C语言中,ioctl函数是用来控制设备的系统调用函数。它的原型如下:cint ioctl(int fd, unsigned lon...
    99+
    2023-10-18
    c语言
  • c语言ioctl函数的作用是什么
    ioctl函数的作用是通过设备文件进行设备的控制和信息的获取。它能够对设备进行一些特殊的操作,如设置设备参数、发送控制命令、获取设备...
    99+
    2023-08-08
    c语言 ioctl
  • Linux中signal()函数怎么使用
    本篇文章和大家了解一下Linux中signal()函数怎么使用。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。signal() 函数无意中看到了 signal() 函数,感觉对这个函数的原型有诸多疑惑,学习一下,顺便分享。...
    99+
    2023-08-03
  • 怎么在Linux中调用fsync函数
    怎么在Linux中调用fsync函数?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。功能描述: 同步内存中所有已修改的文件数据到储存设备。 用法: #include <...
    99+
    2023-06-13
  • 如何在Linux中使用popen函数
    如何在Linux中使用popen函数?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。函数定义#include <stdio.h>FILE *&...
    99+
    2023-06-09
  • 如何在linux 中使用open()函数
    本篇文章给大家分享的是有关如何在linux 中使用open()函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。open()函数创建文件时便捷的权限设置头文件#include&...
    99+
    2023-06-09
  • 如何在Linux 中使用getcwd()函数
    这期内容当中小编将会给大家带来有关如何在Linux 中使用getcwd()函数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。#include<unistd.h>char *getcw...
    99+
    2023-06-09
  • 如何在linux中使用awk函数
    如何在linux中使用awk函数 ?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、算术函数:以下算术函数执行与 C 语言中名称相同的子例程相同的操作:函数名说明atan2( ...
    99+
    2023-06-13
  • Trunc函数怎么在Oracle中使用
    这期内容当中小编将会给大家带来有关Trunc函数怎么在Oracle中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. Trunc( date)trunc ...
    99+
    2024-04-02
  • decode函数怎么在Oracle中使用
    decode函数怎么在Oracle中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。含义解释: decode(条件,值1,返回值1,值2...
    99+
    2024-04-02
  • 怎么在mysql中使用if函数
    今天就跟大家聊聊有关怎么在mysql中使用if函数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体场景如下, 先看看表结构:CREATE...
    99+
    2024-04-02
  • 怎么在oracle中使用decode函数
    今天就跟大家聊聊有关怎么在oracle中使用decode函数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1:使用decode判断字符串是否一样DE...
    99+
    2024-04-02
  • find_in_set()函数怎么在mysql中使用
    这期内容当中小编将会给大家带来有关find_in_set()函数怎么在mysql中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。MySQL手册中find_in_set...
    99+
    2024-04-02
  • 怎么在mysql中使用find_in_set()函数
    这篇文章将为大家详细讲解有关怎么在mysql中使用find_in_set()函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。MySQL手册中find_in...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作