ioctl函数_通过ioctl函数设置IP不允许修改

ioctl函数_通过ioctl函数设置IP不允许修改一、什么是ioctl  ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。  ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数来控制设备的I/O通道。  用户程序所作的只是通过命令码(cmd)告诉驱动程序它想…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、什么是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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180647.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月18日 下午1:46
下一篇 2022年10月18日 下午1:46


相关推荐

  • arcgis 导入 GML文件

    arcgis 导入 GML文件导入 arcgis 面要素文件 nbsp GML 格式 nbsp xml 文件操作如下 ArcToolbox nbsp DataInterope 工具 快速导入 InputDataSet Format GML GeographyMar ok

    2026年3月18日
    1
  • 前端进大厂难吗_java程序员怎么才能进大厂

    前端进大厂难吗_java程序员怎么才能进大厂冰河肝了一个月整理的并发编程知识体系,这应该是全网最全的并发编程知识体系了,学完进大厂不再难,强烈建议收藏!!

    2022年8月22日
    9
  • Android组件化方案

    Android组件化方案随着 APP 版本不断的迭代 新功能的不断增加 业务也会变的越来越复杂 APP 业务模块的数量有可能还会继续增加 而且每个模块的代码也变的越来越多 这样发展下去单一工程下的 APP 架构势必会影响开发效率 增加项目的维护成本 每个工程师都要熟悉如此之多的代码 将很难进行多人协作开发 而且 Android 项目在编译代码的时候电脑会非常卡 又因为单一工程下代码耦合严重 每修改一处代码后都要重新编译打包测试 导致非常耗时

    2026年3月26日
    2
  • pycharm 激活码Key is invalid(JetBrains全家桶)

    (pycharm 激活码Key is invalid)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1STL5S9V8F-eyJsaWNlbnNlSWQiOi…

    2022年3月27日
    1.1K
  • SpringBoot自定义starters

    SpringBoot自定义startersSpringBoot自定义starters1、简介2、如何自定义starter1、简介SpringBoot最强大的功能就是把我们常用的场景 抽象成一个个starter(场景启动器),我们通过引入springBoot为我们提供这些场景启动器,我们再进行少量的配置就能使用相应的功能。但是,SpringBoot不能包含所有的场景,经常需要我们自定义starter,来简化我们对springBoot的使用。2、如何自定义starter…

    2025年8月14日
    4
  • 通义千问Qwen上线「深入研究」Deep Research功能

    通义千问Qwen上线「深入研究」Deep Research功能

    2026年3月13日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号