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
指定针对本套接口的SIGIO
或SIGURG
信号的接收进程。本请求和fcntl
的F_GETOWN
命令等效,POSIX
标准化的是fcntl
函数。
SIOCSPGRP
:
把本套接口的进程ID
或者进程组ID
设置成第三个参数指向的整数,该ID
指定针对本套接口的SIGIO
或SIGURG
信号的接收进程,本请求和fcntl
的F_SETOWN
命令等效,POSIX
标准化的是fcntl
操作。
文件操作:
以下5
个请求都要求ioctl
的第三个参数指向一个整数。
FIONBIO
:
根据ioctl
的第三个参数指向一个0
或非0
值分别清除或设置本套接口的非阻塞标志。本请求和O_NONBLOCK
文件状态标志等效,而该标志通过fcntl
的F_SETFL
命令清除或设置。
FIOASYNC
:
根据iocl
的第三个参数指向一个0
值或非0
值分别清除或设置针对本套接口的信号驱动异步I/O
标志,它决定是否收取针对本套接口的异步I/O
信号(SIGIO
)。本请求和O_ASYNC
文件状态标志等效,而该标志可以通过fcntl
的F_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
结构的初始化结构,其中缓冲区的大小为1024
,ioctl
的第三个参数指向
这样一个ifconf
结构。
1024
--------------------->
缓存
假设内核返回2
个ifreq
结构,ioctl
返回时通过同一个ifconf
结构缓冲区填入了那2
个ifreq
结构,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.h`这个头文件来实现对设备的控制。 `ioctl.h`是Linux内核提供的一份头文件,其中包含了定义IOCTL命令、处理设备控制请求的函数声明和常量定义。在编写...
以下是部分核心函数的说明: 1. `f_mount`: 该函数用于在FatFs模块上注册或注销一个工作区,即文件系统对象。它接受两个参数:逻辑驱动器号(0-9)和指向工作区的指针。 2. `f_open`: 这个函数用于创建或打开一个...
标题“VxWorks编程常用函数说明.pdf”揭示了这份文档的主要内容是针对VxWorks操作系统环境下的编程任务,具体提供了一系列在VxWorks系统中常用的编程函数。VxWorks是一款嵌入式实时操作系统(RTOS),它被广泛应用于...
本文将详细介绍几个常见的文件访问函数,包括`open()`、`close()`、`ioctl()`以及读写操作等,并通过具体的示例帮助读者更好地理解和应用这些函数。 #### 1. `open()` 函数 `open()` 函数用于打开或创建一个文件,...
Linux 设备驱动程序头文件及内核函数说明总结 标题:头文件及内核函数说明总结-Linux 设备驱动程序 描述:Linux 设备驱动程序头文件及内核函数相关定义,包括常用头文件、内核函数、设备驱动程序编写等内容。 ...
`scsi_ioctl` 是与SCSI设备交互的控制函数,它允许用户空间程序向内核发送特定的SCSI命令,以执行高级操作,如读写设备参数、检测设备状态等。 `ioctl` 是操作系统的输入/输出控制函数,用于设备驱动程序和应用程序...
详细介绍了`SPY_IO_SEGMENT` IOCTL函数的工作原理及其应用场景。 **4.2.6 IOCTL 函数 SPY_IO_INTERRUPT** 这部分解释了`SPY_IO_INTERRUPT` IOCTL函数如何用于处理中断相关的操作。 **4.2.7 IOCTL 函数 SPY_IO_...
函数说明:该函数用于从设备的指定寄存器读取数据。BASE表示寄存器所在的基地址,REGNUM则表示寄存器的偏移量。读取的数据位于地址总线的范围内。 返回值:从寄存器中读取到的值 2. IOWR函数 函数原型:IOWR(BASE, ...
**函数说明:** 此函数用于从寄存器读取数据。它会根据提供的`BASE`和`REGNUM`计算出寄存器的实际地址,并读取该地址上的数据。 **返回值:** 无返回值。通常情况下,读取的数据会被保存到一个变量中以便后续处理...
Winsock API中包含的函数众多,以下是一些主要的函数说明: 1. **accept()**:用于接受来自客户端的连接请求,返回一个新的Socket,该Socket将用于与客户端进行数据通信。 2. **bind()**:将Socket绑定到特定的IP...
**函数说明**:此函数用于从设备的指定寄存器读取数据。它根据提供的基地址和偏移量定位到具体的寄存器,并读取其中的数据。 **返回值**:读取的寄存器值。 ##### IOWR(BASE, REGNUM, DATA) **函数原型**:`void ...
- **函数说明**:此函数用于从基地址为`BASE`的设备中读取寄存器中偏移量为`REGNUM`的单元里的值。寄存器的值位于地址总线的范围内。 - **返回值**:读取到的数据。 **2. IOWR(BASE, REGNUM, DATA)** - **函数原型...
- **函数说明**:此函数用于从基地址为`BASE`的设备中读取寄存器中偏移量为`REGNUM`的单元里的值。寄存器的值必须在地址总线的可访问范围内。 - **返回值**:返回读取到的寄存器值。 2. **IOWR(BASE, REGNUM, ...
**函数说明:** 该函数用于从基地址为`BASE`的设备中读取寄存器中偏移量为`REGNUM`的单元里面的数据。这里的关键点在于理解“基地址”和“偏移量”的含义。基地址是指设备或模块的起始地址,而偏移量则是相对于该基...
本文档将详细介绍Nios II中的一些常用函数及其应用场景,主要涉及DMA(Direct Memory Access)收发信道相关的函数以及与Flash操作相关的函数。 #### 二、DMA收发信道相关函数 ##### 1. alt_dma_rxchan_ioctl **...
SPI_Send函数用于发送数据,其内部调用ioctl底层函数并将发送的数据记录到log中,参数与标准ioctl函数相同,返回值为0表示成功,-1表示失败。SPI_Receive函数则用于接收数据,同样记录接收数据到log,参数和返回值...
以下是部分关键函数的详细说明: 1. **f_mount**:此函数用于在FatFs模块上注册或注销一个工作区。在使用其他文件操作前,需要先调用f_mount为每个卷分配工作区。工作区由逻辑驱动器号和指向FATFS结构体的指针定义...
**函数说明**: 此函数用于从指定的寄存器中读取数据。其中`BASE`参数表示寄存器的基地址,而`REGNUM`则表示相对于该基地址的寄存器偏移量。通过这两个参数,可以确定需要读取的寄存器的具体位置。 **输入参数**: ...