zoukankan      html  css  js  c++  java
  • ioctl函数详细说明

    ioctl函数

     

    本函数影响由fd参数引用的一个打开的文件。

     

    #include<unistd.h>

    int ioctl( int fd, int request, .../* void *arg */ );

    返回0:成功    -1:出错

     

    第三个参数总是一个指针,但指针的类型依赖于request参数。

    我们可以把和网络相关的请求划分为6类:

    套接口操作

    文件操作

    接口操作

    ARP高速缓存操作

    路由表操作

    流系统

    下表列出了网络相关ioctl请求的request参数以及arg地址必须指向的数据类型:

     

    类别

    Request

    说明

    数据类型

    SIOCATMARK

    SIOCSPGRP

    SIOCGPGRP

    是否位于带外标记

    设置套接口的进程ID或进程组ID

    获取套接口的进程ID或进程组ID

    int

    int

    int

     

     

     

     

    FIONBIN

    FIOASYNC

    FIONREAD

    FIOSETOWN

    FIOGETOWN

     

    设置/清除非阻塞I/O标志

    设置/清除信号驱动异步I/O标志

    获取接收缓存区中的字节数

    设置文件的进程ID或进程组ID

    获取文件的进程ID或进程组ID

    int

    int

    int

    int

    int

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    SIOCGIFCONF

    SIOCSIFADDR

    SIOCGIFADDR

    SIOCSIFFLAGS

    SIOCGIFFLAGS

    SIOCSIFDSTADDR

    SIOCGIFDSTADDR

    SIOCGIFBRDADDR

    SIOCSIFBRDADDR

    SIOCGIFNETMASK

    SIOCSIFNETMASK

    SIOCGIFMETRIC

    SIOCSIFMETRIC

    SIOCGIFMTU

    SIOCxxx

    获取所有接口的清单

    设置接口地址

    获取接口地址

    设置接口标志

    获取接口标志

    设置点到点地址

    获取点到点地址

    获取广播地址

    设置广播地址

    获取子网掩码

    设置子网掩码

    获取接口的测度

    设置接口的测度

    获取接口MTU

    (还有很多取决于系统的实现)

    struct ifconf

    struct ifreq

    struct ifreq

    struct ifreq

    struct ifreq

    struct ifreq

    struct ifreq

    struct ifreq

    struct ifreq

    struct ifreq

    struct ifreq

    struct ifreq

    struct ifreq

    struct ifreq

     

    ARP

    SIOCSARP

    SIOCGARP

    SIOCDARP

    创建/修改ARP表项

    获取ARP表项

    删除ARP表项

    struct arpreq

    struct arpreq

    struct arpreq

    SIOCADDRT

    SIOCDELRT

    增加路径

    删除路径

    struct rtentry

    struct rtentry

    I_xxx

     

     

     

     

    套接口操作:

    明确用于套接口操作的ioctl请求有三个,它们都要求ioctl的第三个参数是指向某个整数的一个指针。

     

    SIOCATMARK:    如果本套接口的的度指针当前位于带外标记,那就通过由第三个参数指向的整数返回一个非0值;否则返回一个0值。POSIX以函数sockatmark替换本请求。

    SIOCGPGRP       通过第三个参数指向的整数返回本套接口的进程ID或进程组ID,该ID指定针对本套接口的SIGIOSIGURG信号的接收进程。本请求和fcntlF_GETOWN命令等效,POSIX标准化的是fcntl函数。

    SIOCSPGRP     把本套接口的进程ID或者进程组ID设置成第三个参数指向的整数,该ID指定针对本套接口的SIGIOSIGURG信号的接收进程,本请求和fcntlF_SETOWN命令等效,POSIX标准化的是fcntl操作。

     

    文件操作:

    以下5个请求都要求ioctl的第三个参数指向一个整数。

     

    FIONBIO        根据ioctl的第三个参数指向一个0或非0值分别清除或设置本套接口的非阻塞标志。本请求和O_NONBLOCK文件状态标志等效,而该标志通过fcntlF_SETFL命令清除或设置。

     

    FIOASYNC      根据iocl的第三个参数指向一个0值或非0值分别清除或设置针对本套接口的信号驱动异步I/O标志,它决定是否收取针对本套接口的异步I/O信号(SIGIO)。本请求和O_ASYNC文件状态标志等效,而该标志可以通过fcntlF_SETFL命令清除或设置。

     

    FIONREAD     通过由ioctl的第三个参数指向的整数返回当前在本套接口接收缓冲区中的字节数。本特性同样适用于文件,管道和终端。

     

    FIOSETOWN    对于套接口和SIOCSPGRP等效。

    FIOGETOWN    对于套接口和SIOCGPGRP等效。

     

    接口配置:

    得到系统中所有接口由SIOCGIFCONF请求完成,该请求使用ifconf结构,ifconf又使用ifreq

    结构,如下所示:

     

    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;

    };

     

    #define ifr_addr     ifr_ifru.ifru_addr            // address

    #define ifr_dstaddr   ifr_ifru.ifru_dstaddr         // otner end of p-to-p link

    #define ifr_broadaddr ifr_ifru.ifru_broadaddr    // broadcast address

    #define ifr_flags     ifr_ifru.ifru_flags        // flags

    #define ifr_metric    ifr_ifru.ifru_metric      // metric

    #define ifr_data      ifr_ifru.ifru_data        // for use by interface

     

    再调用ioctl前我们必须先分撇一个缓冲区和一个ifconf结构,然后才初始化后者。如下图

    展示了一个ifconf结构的初始化结构,其中缓冲区的大小为1024ioctl的第三个参数指向

    这样一个ifconf结构。

    ifc_len

     Ifc_buf

    1024

    --------------------->缓存

     

     

    假设内核返回2ifreq结构,ioctl返回时通过同一个ifconf结构缓冲区填入了那2ifreq结构,ifconf结构的ifc_len成员也被更新,以反映存放在缓冲区中的信息量





  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/babyhhcsy/p/2822691.html
Copyright © 2011-2022 走看看