`

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 成员也被更新,以反映存放在缓冲区中的信息量

一般来讲ioctl在用户程序中的调用是:
ioctl(int fd,int command, (char*)argstruct)
ioctl调用与网络编程有关(本文只讨论这一点),文件描述符fd实际上是由socket()系统调用返回的。参数command的取值由/usr/include/linux/sockios.h 所规定。这些command的由于功能的不同,可分为以下几个小类:
• 改变路由表 (例如 SIOCADDRT, SIOCDELRT),
• 读/更新 ARP/RARP 缓存(如:SIOCDARP, SIOCSRARP),
• 一般的与网络接口有关的(例如 SIOCGIFNAME, SIOCSIFADDR 等等)
在 Gooodies目录下有很多样例程序展示了如何使用ioctl。当你看这些程序时,注意参数argstruct是与参数command相关的。例如,与 路由表相关的ioctl使用rtentry这种结构,rtentry定义在/usr/include/linux/route.h(参见例子 adddefault.c)。与ARP有关的ioctl调用使用arpreq结构,arpreq定义在/usr/include/linux /if_arp.h(参见例子arpread.c)
与网络接口有关的ioctl调用使用的command参数通常看起来像SIOCxIFyyyy的形式,这里x要 么是S(设定set,写write),要么是G(得到get,读read)。在getifinfo.c程序中就使用了这种形式的command参数来读 IP地址,硬件地址,广播地址和得到与网络接口有关的一些标志(flag)。在这些ioctl调用中,第三个参数是ifreq结构,它在/usr /include/linux/if.h中定义。在某些情况下, ioctrl调用可能会使用到在sockios.h之外的新的定义,例如,WaveLAN无线网络卡会保
分享到:
评论

相关推荐

    IOCTL头文件说明

    "IOCTL头文件说明"指的是在编程过程中,如何理解和使用`ioctl.h`这个头文件来实现对设备的控制。 `ioctl.h`是Linux内核提供的一份头文件,其中包含了定义IOCTL命令、处理设备控制请求的函数声明和常量定义。在编写...

    嵌入式文件系统函数说明

    以下是部分核心函数的说明: 1. `f_mount`: 该函数用于在FatFs模块上注册或注销一个工作区,即文件系统对象。它接受两个参数:逻辑驱动器号(0-9)和指向工作区的指针。 2. `f_open`: 这个函数用于创建或打开一个...

    VxWorks编程常用函数说明.pdf

    标题“VxWorks编程常用函数说明.pdf”揭示了这份文档的主要内容是针对VxWorks操作系统环境下的编程任务,具体提供了一系列在VxWorks系统中常用的编程函数。VxWorks是一款嵌入式实时操作系统(RTOS),它被广泛应用于...

    linux设备驱动—底层文件访问函数说明

    本文将详细介绍几个常见的文件访问函数,包括`open()`、`close()`、`ioctl()`以及读写操作等,并通过具体的示例帮助读者更好地理解和应用这些函数。 #### 1. `open()` 函数 `open()` 函数用于打开或创建一个文件,...

    头文件及内核函数说明总结-linux设备驱动程序

    Linux 设备驱动程序头文件及内核函数说明总结 标题:头文件及内核函数说明总结-Linux 设备驱动程序 描述:Linux 设备驱动程序头文件及内核函数相关定义,包括常用头文件、内核函数、设备驱动程序编写等内容。 ...

    scsi_ioctl.rar_scsi ioctl

    `scsi_ioctl` 是与SCSI设备交互的控制函数,它允许用户空间程序向内核发送特定的SCSI命令,以执行高级操作,如读写设备参数、检测设备状态等。 `ioctl` 是操作系统的输入/输出控制函数,用于设备驱动程序和应用程序...

    Undocumented Windows 2000 Secrets 中文版

    详细介绍了`SPY_IO_SEGMENT` IOCTL函数的工作原理及其应用场景。 **4.2.6 IOCTL 函数 SPY_IO_INTERRUPT** 这部分解释了`SPY_IO_INTERRUPT` IOCTL函数如何用于处理中断相关的操作。 **4.2.7 IOCTL 函数 SPY_IO_...

    NiosII 常用函数详解

    函数说明:该函数用于从设备的指定寄存器读取数据。BASE表示寄存器所在的基地址,REGNUM则表示寄存器的偏移量。读取的数据位于地址总线的范围内。 返回值:从寄存器中读取到的值 2. IOWR函数 函数原型:IOWR(BASE, ...

    NiosII 常用函数详解.pdf

    **函数说明:** 此函数用于从寄存器读取数据。它会根据提供的`BASE`和`REGNUM`计算出寄存器的实际地址,并读取该地址上的数据。 **返回值:** 无返回值。通常情况下,读取的数据会被保存到一个变量中以便后续处理...

    windows socket api函数大全

    Winsock API中包含的函数众多,以下是一些主要的函数说明: 1. **accept()**:用于接受来自客户端的连接请求,返回一个新的Socket,该Socket将用于与客户端进行数据通信。 2. **bind()**:将Socket绑定到特定的IP...

    NIOS II常用函数详解

    **函数说明**:此函数用于从设备的指定寄存器读取数据。它根据提供的基地址和偏移量定位到具体的寄存器,并读取其中的数据。 **返回值**:读取的寄存器值。 ##### IOWR(BASE, REGNUM, DATA) **函数原型**:`void ...

    NIOS II中文函数详解

    - **函数说明**:此函数用于从基地址为`BASE`的设备中读取寄存器中偏移量为`REGNUM`的单元里的值。寄存器的值位于地址总线的范围内。 - **返回值**:读取到的数据。 **2. IOWR(BASE, REGNUM, DATA)** - **函数原型...

    NIOS_II常用函数详解

    - **函数说明**:此函数用于从基地址为`BASE`的设备中读取寄存器中偏移量为`REGNUM`的单元里的值。寄存器的值必须在地址总线的可访问范围内。 - **返回值**:返回读取到的寄存器值。 2. **IOWR(BASE, REGNUM, ...

    NIOS II常用函数

    **函数说明:** 该函数用于从基地址为`BASE`的设备中读取寄存器中偏移量为`REGNUM`的单元里面的数据。这里的关键点在于理解“基地址”和“偏移量”的含义。基地址是指设备或模块的起始地址,而偏移量则是相对于该基...

    NIOSII常用函数

    本文档将详细介绍Nios II中的一些常用函数及其应用场景,主要涉及DMA(Direct Memory Access)收发信道相关的函数以及与Flash操作相关的函数。 #### 二、DMA收发信道相关函数 ##### 1. alt_dma_rxchan_ioctl **...

    V2X车载芯片处理性能测试软件开发环境和SPI通讯统计库、测试用例库函数接口说明、业务签名验签错误码

    SPI_Send函数用于发送数据,其内部调用ioctl底层函数并将发送的数据记录到log中,参数与标准ioctl函数相同,返回值为0表示成功,-1表示失败。SPI_Receive函数则用于接收数据,同样记录接收数据到log,参数和返回值...

    FatFS文件系统函数说明

    以下是部分关键函数的详细说明: 1. **f_mount**:此函数用于在FatFs模块上注册或注销一个工作区。在使用其他文件操作前,需要先调用f_mount为每个卷分配工作区。工作区由逻辑驱动器号和指向FATFS结构体的指针定义...

    NIOS II 常用函数整理

    **函数说明**: 此函数用于从指定的寄存器中读取数据。其中`BASE`参数表示寄存器的基地址,而`REGNUM`则表示相对于该基地址的寄存器偏移量。通过这两个参数,可以确定需要读取的寄存器的具体位置。 **输入参数**: ...

Global site tag (gtag.js) - Google Analytics