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 函数是一个系统调用函数,用于控制设备或文件描述符的参数。它可以用来执行各种操作,如获取或设置设备参数、执行设备命令、获取或设置文件描述符的参数等。 在 Linux 系统中,ioctl ...
ioctl函数的使用 Ioctl函数是一种控制I/O设备的函数,主要用来控制设备的行为和交互。Ioctl函数的使用可以分为两个方面:一是控制I/O设备的行为,二是交互数据传输。 在include/asm/ioctl.h头文件中,定义了 ioctl...
"Linux 下的 ioctl 函数" ioctl 函数是 Linux 驱动程序中对设备的 I/O 通道进行管理的函数,它可以控制设备的一些特性,例如串口的传输波特率、马达的转速等等。ioctl 函数的调用格式为 int ioctl(int fd, int cmd,...
### ioctl函数详解:深入理解设备控制的核心机制 在Linux系统编程中,`ioctl`函数扮演着设备控制的关键角色。本文将全面解析`ioctl`函数的工作原理、如何在内核模块中实现以及其在用户空间与内核空间通信中的重要性...
"Linux下的ioctl函数详解" Linux操作系统中,ioctl函数是一个非常重要的概念,它是设备驱动程序中对设备的I/O通道进行管理的函数。下面,我们将详细讨论ioctl函数的定义、必要性、实现方式、cmd参数的生成等方面。 ...
ioctl函数在Linux操作系统中扮演着重要的角色,它是设备驱动程序和应用程序之间进行通信的主要机制之一。这个函数允许用户空间的应用程序对设备进行控制操作,比如配置硬件参数、获取设备状态等,而不仅仅是简单的...
IOCTL函数与网络接口[整理].pdf
ioctl 函数可以用来设置或获取设备文件的属性、控制设备的行为、执行特殊的 I/O 操作等。 在以下四个示例程序中,我们将展示如何使用 ioctl 来检测接口的 inet_addr、netmask、broad_addr,检查接口的物理连接是否...
ioctl 函数详解 ioctl 函数是 Unix 操作系统中用于控制设备的输入/输出操作的函数。它可以影响由 fd 参数引用的一个打开的文件。该函数的原型为: `int ioctl(int fd, int request, .../* void *arg */ );` 其中...
ioctl 函数详解 ioctl 函数是一个重要的系统调用函数,它可以控制和查询文件描述符相关的信息。该函数的原型为: `int ioctl(int fd, int request, .../* void *arg */);` 其中,`fd` 是一个打开的文件描述符,`...
高级字符驱动(llseek和ioctl函数) 一、高级字符驱动概述 高级字符驱动是指设备驱动程序中除了基本的读写能力外,还需要进行其他硬件控制操作的能力。这种能力通常通过ioctl函数来实现。 二、ioctl函数 ioctl函数...
IOCTL函数与网络接口.pdf
IOCTL代码由四个部分组成,分别是函数类、功能码、访问类型和设备类型。这四个部分都是无符号整数,并按照特定的方式组合成一个32位或64位的值。函数类通常表示驱动程序的主要功能,如磁盘、键盘或鼠标操作。功能码...
`ioctl`函数是Unix-like操作系统中用于控制设备和获取设备状态的重要函数。它允许程序员对文件描述符(如网络套接字、磁盘文件等)进行低级别的操作,执行特定设备驱动程序支持的操作。`ioctl`函数的原型如下: ```...
4. sys_ioctl函数:sys_ioctl函数是整个ioctl系统调用过程中的最顶级函数。它需要对输入的参数进行预处理,检查参数的合法性,然后调用底层的处理函数作更进一步的处理。 ioctl系统调用流程是一个复杂的过程,涉及...
而`alt_dma_rxchan_ioctl`函数提供了对DMA接收信道的I/O控制,允许设置传输模式和其他特定参数。例如,可以通过此函数切换传输数据的宽度,如8位、16位、32位等,并可以设置接收信道的行为,如只接收或只发送。 ...
在Linux内核中,ioctl函数用于处理特定的设备操作,这些操作不通过常规的读写系统调用完成。在DRM上下文中,ioctl调用可能包括设置显示模式、分配和管理帧缓冲、设置渲染状态等。`drm_ioctl.c`通常包含了大量的ioctl...
ioctl函数在内核中定义了一种灵活的方式,以处理各种设备特有的请求,这些请求不能通过标准的read、write等系统调用来完成。 “ioctl_kb_m”可能指的是键盘(keyboard)和鼠标(mouse)设备的ioctl命令集。在示例...
程序里面使用的是ioctl(ioctl是应用与驱动的常用接口。对字符设备、块设备、及套接字,非常方便扩充新的命令)。 QT版本(qt-opensource-linux-x64-5.13.2)。 使用了QT的线程, 相机的整个采图过程在子线程中进行...