ioctl函数
此函数影响由软盘参数引用的打开的文件。
#包含
intioctl(intFD,int request,
0 :成功-1:返回错误
第三个参数始终是指针,但指针类型取决于请求参数。
可以将与互联网相关的请求分为六大类。
套接字操作
文件操作
界面操作
ARP缓存操作
使用路由表
流媒体系统
下表列出了与网络相关的ioctl请求的请求参数,以及arg地址必须指向的数据类型。
类别
请求
说明
数据类型
夹克
连接起来
嘴巴
SIOCATMARK
SIOCSPGRP
SIOCGPGRP
是否在频带外标记上
设置套接字的进程ID或进程组ID
获取套接字的进程ID或进程组ID
资讯科技
资讯科技
资讯科技
句子
条件
FIONBIN
fio同步
FIONREAD
fios电子
光纤网络
无阻塞I/O标志的设定/清除
信号驱动异步I/O标志的设定/清除
获取接收缓冲区中的字节数
设置文件的进程ID或进程组ID
获取文件的进程ID或进程组ID
资讯科技
资讯科技
资讯科技
资讯科技
资讯科技
连接起来
嘴巴
SIOCGIFCONF
SIOCSIFADDR
SIOCGIFADDR
SIOCSIFFLAGS
SIOCGIFFLAGS
SIOCSIFDSTADDR
SIOCGIFDSTADDR
SIOCGIFBRDADDR
SIOCSIFBRDADDR
SIOCGIFNETMASK
SIOCSIFNETMASK
SIOCGIFMETRIC
SIOCSIFMETRIC
赛门铁克足球俱乐部
SIOCxxx
获取所有接口的列表
接口地址的设定
获取接口地址
接口标志的设置
获取接口标志
点对点地址的设定
获取点对点的地址
获取广播地址
广播地址设置
获取子网掩码
设置子网掩码
得到接口的测度
设定接口的测度
获取接口MTU
(很多情况下取决于系统的实现)
结构ifconf
结构ifreq
结构ifreq
结构ifreq
结构ifreq
结构ifreq
结构ifreq
结构ifreq
结构ifreq
结构ifreq
结构ifreq
结构ifreq
结构ifreq
结构ifreq
ARP
SIOCSARP
SIOCGARP
SIOCDARP
创建/修改ARP表条目
获取ARP表条目
删除ARP表条目
结构ARP req
结构ARP req
结构ARP req
道路
自由
SIOCADDRT
SIOCDELRT
添加路径
删除路径
结构延迟
结构延迟
水流
I_xxx
套接字操作:
显式用于接口操作的ioctl请求有三个,这两个请求都要求ioctl的第三个参数是指向整数的指针。
SIOCATMARK:如果此接口的度指针当前位于带外标记上,则第三个参数指向的整数将返回非零值。 否则返回0的值。 POSIX将此请求替换为函数sockatmark。
SIOCGPGRP第二个参数指定的整数,返回此接口的进程ID或进程组ID。 此ID指定向该接口接收SIGIO或SIGURG信号的过程。 该请求与fcntl的F_GETOWN命令相同,在POSIX中标准化的是fcntl函数。
SIOCSP
GRP : 把本套接口的进程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 结构。
ifc_len
Ifc_buf
1024
---------------------> 缓存
假设内核返回2 个ifreq 结构,ioctl 返回时通过同一个ifconf 结构缓冲区填入了那2 个ifreq 结构,ifconf 结构的ifc_len 成员也被更新,以反映存放在缓冲区中的信息量