ioctl函数_通过ioctl函数设置IP不允许修改
大家好,又见面了,我是你们的朋友全栈君。
一、什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。 ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数来控制设备的I/O通道。 用户程序所作的只是通过命令码(cmd)告诉驱动程序它想做什么,至于怎么解释这些命令和怎么实现这些命令,这都是驱动程序要做的事情。
二、 ioctl如何实现 在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事情。因为设备都是特定的,这里也没法说。
三、ioctl参数 1、用户空间,ioctl的调用具有如下原型: int ioctl(int fd, unsigned long cmd, …); 其中fd是用户程序打开设备时使用open函数返回的文件标示符,cmd是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,这个参数的有无和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 from user->kernel
struct ifreq *ifcu_req; // return of structures returned
}ifc_ifcu;
};
#define ifc_buf ifc_ifcu.ifcu_buf //buffer address
#define ifc_req ifc_ifcu.ifcu_req //array of structures returned
#define IFNAMSIZ 16
struct ifreq{
char ifr_name[IFNAMSIZ]; // interface name, e.g., “le0”
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;
};
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
struct ifreq *get_ifreq();
int main(int argc, char **argv)
{
struct ifreq *ifr, *tobefree;
ifr = tobefree = get_ifreq();
do {
printf("%s\n", ifr->ifr_name);
ifr++;
} while (ifr->ifr_name[0] != 0);
free(tobefree);
exit(0);
}
struct ifreq *get_ifreq()
{
int sockfd, len, lastlen;
char *buf;
struct ifconf ifc;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
lastlen = 0;
len = 40 * sizeof(struct ifreq); /* initial buffer size guess */
for ( ; ; ) {
buf = malloc(len);
ifc.ifc_len = len;
ifc.ifc_buf = buf;
if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
if (errno != EINVAL || lastlen != 0) {
perror("ioctl");
exit(-1);
}
} else {
if (ifc.ifc_len == lastlen) {
break; /* success, len has not changed */
}
lastlen = ifc.ifc_len;
}
len += 10 * sizeof(struct ifreq); /* increment */
free(buf);
}
return ((struct ifreq *)ifc.ifc_buf);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/180647.html原文链接:https://javaforall.cn
相关文章
- Ip地址归属地_电脑ip地址归属地查询
- 三种方法告诉你项目超过255个摄像机怎么设置IP?什么是公网ip?什么又是内网ip?为什么ip地址通常以192.168开头?
- Linux动态IP配置:从入门到精通(linux设置动态ip)
- Linux系统如何锁定IP呢?(linux锁定ip)
- 驾驭双 IP:Linux 操作系统设置(linux设置双ip)
- Linux虚拟机中IP设置指南(linux虚拟机ip设置)
- 控制Linux IP登录控制:实现安全访问(linux登录ip)
- MySQL设置允许特定IP访问(mysql允许ip访问)
- MySQL连接IP:快速简单的设置方法(mysql连接ip)
- Linux绑定网卡IP:一步步指南(linux绑定网卡ip)
- Linux设置IP教程:轻松上手网络配置(怎么给linux设置ip)
- Linux系统中如何设置多网卡多IP?(linux多网卡多ip)
- 权限Linux服务器IP访问控制优化方案(linux服务器ip访问)
- Linux 设置IP:简单步骤和常用命令(linux设置ip命令)
- SQL Server给IP安装设置指南(sqlserver用ip)
- 轻松配置Linux系统的固定IP(设置linux固定ip)
- 深入探索Linux查询IP的新方式(linux的查询ip)
- MySQL中IP字段类型详解(mysql中ip字段类型)
- 失败本地Redis启动IP失败排查之路(本地redis启动ip)
- Oracle IP审计防范安全风险的良药(oracle ip审计)
- 控制利用Redis设置IP访问控制(redis 设置ip访问)
- Discuz5.0中读取纯真IP数据库函数分析