Linux内核的ioctl函数学习
我这里说的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中命令码是唯一联系用户程序命 令和驱动程序支持的途径。
命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,
相关文档:
由于我的机器偶尔开发用,所以库比较全。
所以如果您安装的时候,缺啥补啥吧~~
careone 打deb包~~
下载页面:http://forum.ubuntu.org.cn/viewtopic.php?f=137&t=217474
下载地址:http://forum.ubuntu.org.cn/download/file.php?id=73080 ......
下载
飞信机器人Fetion ROBOT
地址:http://www.it-adv.net/index.php?action=downloads
安装
可以参考网页上的标准方法,有详细步骤,或者也可以看一下我的步骤,http://blog.csdn.net/newman0708/archive/2009/02/15/3891871.aspx
命令行用法
LD_LIBRARY_PATH=/home/newman0708/fetion_install/ /home/newman0708/f ......
2.1 框架图
-->PREROUTING-->[ROUTE]-->FORWARD-->POSTROUTING-->
mangle | mangle ^ mangle
nat | filter | na ......
安装环境:
1.上传jdk-6u17-linux-i586.bin和apache-tomcat-6.0.20.tar.gz到/usr
2.安装JDK
$chmod a+x jdk-6u17-linux-i586.bin
$ ./jdk-6u17-linux-i586.bin
$ vi /etc/profile
#添加如下
export JAVA_HOME=/usr/jdk1.6.0_17
export PATH=$JAVA_HOME/bin:$PATH
$echo $JAVA_H ......