ioctl()函数

 概念
 ioctl 是设备驱动程序中设备控制接口函数(操作设备函数),一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。

#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);
参数
        fd          文件描述符
        cmd     交互协议,设备驱动将根据 cmd 执行对应操作
        …         可变参数 arg,依赖 cmd 指定长度以及类型

SIOCGIFCONF              获取所有接口列表          Struct  ifconf
SIOCSIFADDR              设置接口地址                  Struct  ifreq
SIOCGIFADDR              获取接口地址                 Struct  ifreq
SIOCSIFBRDADDR      设置广播地址                  Struct  ifreq
SIOCGIFBRDADDR      获取广播地址                 Struct  ifreq
SIOCSIFNETMASK      设置子网掩码                 Struct  ifreq
SIOCGIFNETMASK     获取子网掩码                 Struct  ifreq
SIOCGIFFLAGS           获取接口标志                Struct  ifreq    


//ifconf 通常是用来保存所有接口信息。
//if.h
struct ifconf
{
        int ifc_len; /* size of buffer */
        union {
                    char *ifcu_buf; /* input from user->kernel*/
                    struct ifreq *ifcu_req; /* return from kernel->user*/
        } ifc_ifcu;
};
#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
#define ifc_req ifc_ifcu.ifcu_req /* array of structures */

//ifreq用来保存某个接口的信息
//if.h
struct ifreq { 
                   char ifr_name[IFNAMSIZ]; 
                    union {
                                struct sockaddr ifru_addr;         
                                struct sockaddr ifru_dstaddr;         
                                struct sockaddr ifru_broadaddr;         
                                short ifru_flags;        
                                int ifru_metric;         
                                caddr_t ifru_data;     
                        } ifr_ifru;
};
#define ifr_addr ifr_ifru.ifru_addr
#define ifr_dstaddr ifr_ifru.ifru_dstaddr
#define ifr_broadaddr ifr_ifru.ifru_broadaddr

参考网站

https://www.man7.org/linux/man-pages/man7/netdevice.7.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容