一、什么是ioctl
ioctl是用设备驱动程序管理设备I/O通道的函数。 管理I/O通道是指控制设备的特性,如串行端口的传输波特率、电机的转速等。
ioctl函数是文件结构的属性组件,只要驱动程序支持ioctl,用户就可以在用户程序中使用ioctl函数来控制设备的I/O通道。
用户程序所做的只是用命令代码(cmd )告诉驱动程序你想做什么,而如何解释和实现这些命令则是驱动程序必须做的。
二、 ioctl如何实现
在驱动程序中安装的ioctl函数内,实际上有switch{case}结构,每个case对应命令代码进行几个操作。 如何实现这些操作是所有程序员自己的事。 设备都是特定的,所以在这里也不能说。
三、ioctl参数
1、用户空间,调用ioctl具有以下原型:
intioctl(intFD,unsigned long cmd,…;
其中,fd是在用户程序打开设备时使用open函数返回的文件标识符,cmd是用户程序用于控制设备的命令,而对于后面的省略号,通常有几个补充参数,最多一个,即有无该参数
2、驱动空间。 ioctl方法的原型如下。
int(*ioctl ) ) struct inode * node,struct file *filp,unsigned int cmd,unsigned long arg );
1 ) inode和file:ioctl操作可能会更改文件属性或访问硬件。 因为要修改文件的属性,必须使用这两个结构,所以这里有指针。
2 ) cmd :控制命令。
3 ) arg :补充参数。
在此插入图像说明
Struct ifconf{ int ifc_len; //缓冲区大小union{ caddr_t ifcu_buf; //input fromuser-kernelstructifreq * ifcu _ req; //returnofstructuresreturned } IFC _ ifcu; (; # define IFC _ buf IFC _ ifcu.ifcu _ buf//buffer address # define IFC _ req ifcu.ifcu _ req//arrayofstructurecturer 结构sockaddr ifru _ dstaddr; 结构sockaddr ifru _ broad addr; short ifru_flags; int ifru_metric; caddr_t ifru_data; }ifr_ifru; (; # include stdio.h # include stdlib.h # include errno.h # includesys/ioctl.h # includesys/socket.h # include net/if ifr=tobefree=get_ifreq (; do { printf('%sn ',ifr-ifr_name; ifr; }while(IFR-IFR_name[0]!=0; 自由(tobe free ); 退出(0; }struct ifreq *get_ifreq () { int sockfd,len,lastlen; char *buf; 结构IFconf IFc; sockfd=socket(af_inet,SOCK_DGRAM,0 ); lastlen=0; len=40 * sizeof (结构ifreq );/*初始缓冲器尺寸guess */for (; (buf=malloc(Len ); ifc.ifc_len=len; ifc.ifc_buf=buf; if(ioctl(sockfd,SIOCGifcONF,IFC )0) if ) Errno!=ein val |!=0) perror('ioctl ); exit(-1; }else{if(IFC.IFC_len==Lastlen ) { break; /* success,lenhasnotchanged */} lastlen=IFC.IFC _ len; } len=10 * sizeof (结构ifreq );/*增量* /自由(buf ); } return ((结构ifreq * ) ifc.ifc_buf ); }