ioctl函数用法小记
By francis_hao Aug 27,2017
UNPV1对ioctl有算是比较详细的介绍,但是,这些request和后面的数据类型是从哪里来的,以及参数具体该如何使用呢?本文尝试在不借助书籍,而仅仅使用linux系统下的资源编写可行的调用ioctl的程序。
ioctl – 控制设备
概要
|
#include <sys/ioctl.h> |
描述
ioctl()函数操纵由参数指定的设备文件,参数d必须是一个打开的文件描述符。第二个参数是一个依赖于设备的请求码。第三个参数是一个指向内存的无类型指针,在void *没有出来之前,此项为char *argp,在之后的讨论中,我们会使用这个名字。
比较重要的第二个参数,它指明了参数是输入参数还是输出参数,还有参数argp的大小。有关request的宏和其他定义在文件<sys/ioctl.h>中。通过ioctl_list(2)也可以看到这些调用列表。
在ioctl_list(2)中,每个ioctl调用的请求码数值、名字和它需要的参数类型都给出了。其中,类似const struct foo *的类型表示是向内核传入的参数,类似struct foo *的类型是从内核传出的参数,如果内核既使用参数传入,也使用参数传出,那么将会用// I-O标识。有些ioctl()函数可能会需要更多的参数,或者返回更多的参数而不仅仅是一个结构体,那么将会用// MORE标识。
一个可能的列表

其中,第一行表示下面的常量所在的头文件,下面的三列分别表示请求码数值、常量名和它需要的参数类型。
然后在相应的头文件中,大部分都会有该常量作用的描述。

返回值
通常,成功会返回0,但也有些请求码将返回值作为结果,非负值为成功。如果出错返回-1,并且errno被置为相应的值。
示例
比如现在有一个简单的需求,获取网卡的ip地址。首先在ioctl_list(2)里搜索ADDR,根据搜索的结果查看所属的头文件,得到如下信息


得到get PA address的SIOCGIFADDR和需要的参数struct ifreq *,并且该参数是I-O形式,通过man –K查找struct ifreq的定义:
|
struct ifreq { |
因为这个结构体比较简单,能够看出来输入和输出参数分别是哪个字段,有些结构体并不能很明显的看出这些,就需要查阅其他资料了。可以通过man –K 查找请求名,结合起来看会得到需要输入什么,输出什么。例如SIOCGIFNAME:

根据以上内容便可以编程了,示例代码如下
|
#include <stdio.h> int main(void) |
执行结果


本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/7441328.html
参考
【1】man 2 ioctl
【2】man 2 ioctl_list
【3】man man
【3】W.Richard Stevens著,杨继张译,UNIX网络编程卷1(第三版) 北京:人民邮电出版社,2012年6月
ioctl函数用法小记的更多相关文章
- IOCTL函数用法
http://blog.163.com/he_junwei/blog/static/19793764620152510533753/ http://blog.csdn.net/styyzxjq2009 ...
- printf函数用法小记
By francis_hao Aug 26,2017 C语言中printf函数是一个比较常用的函数,但是常用并不代表完全了解,本文翻译了printf的man手册,介绍了其全部功能(不包括ma ...
- scanf函数用法小记
By francis_hao Aug 26,2017 scanf – 输入格式转换 概述 #include <stdio.h>int scanf(const char *fo ...
- UNIX网络编程——ioctl 函数的用法详解
1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的 ...
- [转载]expect spawn、linux expect 用法小记
原文地址:expect spawn.linux expect 用法小记作者:悟世 使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写 ...
- (笔记)Linux下的ioctl()函数详解
我这里说的ioctl函数是指驱动程序里的,因为我不知道还有没有别的场合用到了它,所以就规定了我们讨论的范围.写这篇文章是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑. ...
- 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
转载请注明出处:windeal专栏 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq 结构体struct ifconf来获取网络接口的各种信息. ioctl 首先看 ...
- linux ioctl()函数
我这里说的ioctl函数是指驱动程序里的,因为我不知道还有没有别的场合用到了它,所以就规定了我们讨论的范围.写这篇文章是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑. ...
- Linux下的ioctl()函数详解
我这里说的ioctl函数是指驱动程序里的,因为我不知道还有没有别的场合用到了它,所以就规定了我们讨论的范围.写这篇文章是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑. ...
随机推荐
- 【WXS全局对象】Date
属性: 名称 说明 Date.parse( [dateString] ) 解析一个日期时间字符串,并返回 1970/1/1 午夜距离该日期时间的毫秒数. Date.UTC(year,month,day ...
- Django学习总结-之-URLS反向解析
2018-09-15 09:58:49 在CSDN博客审核效率提高之前, 又要在此处向各位唠叨了~ URL 与 URI URL : 统一资源定位符 相当于绝对路径 URI : 统一资源标志符 相当于 ...
- Qt+opencv:读取、显示图像
GitHub:点击下载完整代码 本文主要是使用Qt与opencv将图像进行显示在QT界面上. 程序运行后的界面如下所示: (由于只有打开图像之后,才能对图像进行翻转,所以程序设置为读取图像成功之后才能 ...
- 平衡的括号 (Parentheses Balance UVA - 673)
题目描述: 原题:https://vjudge.net/problem/UVA-673 题目思路: 1.水题 2.栈+模拟 3.坑在有空串 AC代码 #include <iostream> ...
- 零基础自学人工智能,看这些资料就够了(300G资料免费送)
为什么有今天这篇? 首先,标题不要太相信,哈哈哈. 本公众号之前已经就人工智能学习的路径.学习方法.经典学习视频等做过完整说明.但是鉴于每个人的基础不同,可能需要额外的学习资料进行辅助.特此,向大家免 ...
- Python3 Tkinter-Checkbutton
1.多选按钮创建 from tkinter import * root=Tk() Checkbutton(root,text='python').pack() root.mainloop() 2.绑定 ...
- 2019-1-92.4G射频芯片培训资料
2019-1-92.4G射频芯片培训资料 培训 RF 小书匠 欢迎走进zozo的学习之旅. 2.4G芯片选型 2.4G芯片开发 Q&A 2.4G芯片选型 芯片类型 soc 防盗标签2.4G无 ...
- 软件工程第四周作业之四则运算-C#实现
拿到题目的时候,快放假了,也没心思做.十月七号的一下午大概从两点做到八点半,加上十月八号的十二点半到两点半,做了一共八个半小时,去掉吃饭半个小时那么一共做了八个小时. 逆波兰表达式我是扒的别人代码,没 ...
- Android 数据存储 之 SQLite数据库详解
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...
- 使用cout进行格式化
以下内容摘自木缥缈的博客 使用cout进行格式化 ostream插入运算符将值转换为文本格式.在默认情况下,格式化值的方式如下. * 对于char值,如果它代表的是可打印字符,则将被作为一个字符显示在 ...