首页 > 编程知识 正文

ioctl返回值,ioctl命令码

时间:2023-05-05 11:34:15 阅读:39037 作者:2044

一、什么是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 ); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。