- 論壇徽章:
- 0
|
本函數(shù)影響由fd參數(shù)引用的一個(gè)打開的文件。
#include
int ioctl( int fd, int request, .../* void *arg */ );
返回0:成功 -1:出錯(cuò)
第三個(gè)參數(shù)總是一個(gè)指針,但指針的類型依賴于request參數(shù)。
我們可以把和網(wǎng)絡(luò)相關(guān)的請(qǐng)求劃分為6類:
套接口操作 文件操作 接口操作 ARP高速緩存操作 路由表操作 流系統(tǒng)
下表列出了網(wǎng)絡(luò)相關(guān)ioctl請(qǐng)求的request參數(shù)以及arg地址必須指向的數(shù)據(jù)類型:
類別
Request
說明
數(shù)據(jù)類型
套
接
口
SIOCATMARK
SIOCSPGRP
SIOCGPGRP
是否位于帶外標(biāo)記
設(shè)置套接口的進(jìn)程ID或進(jìn)程組ID
獲取套接口的進(jìn)程ID或進(jìn)程組ID
int
int
int
文
件
FIONBIN
FIOASYNC
FIONREAD
FIOSETOWN
FIOGETOWN
設(shè)置/清除非阻塞I/O標(biāo)志
設(shè)置/清除信號(hào)驅(qū)動(dòng)異步I/O標(biāo)志
獲取接收緩存區(qū)中的字節(jié)數(shù)
設(shè)置文件的進(jìn)程ID或進(jìn)程組ID
獲取文件的進(jìn)程ID或進(jìn)程組ID
int
int
int
int
int
接
口
SIOCGIFCONF
SIOCSIFADDR
SIOCGIFADDR
SIOCSIFFLAGS
SIOCGIFFLAGS
SIOCSIFDSTADDR
SIOCGIFDSTADDR
SIOCGIFBRDADDR
SIOCSIFBRDADDR
SIOCGIFNETMASK
SIOCSIFNETMASK
SIOCGIFMETRIC
SIOCSIFMETRIC
SIOCGIFMTU
SIOCxxx
獲取所有接口的清單
設(shè)置接口地址
獲取接口地址
設(shè)置接口標(biāo)志
獲取接口標(biāo)志
設(shè)置點(diǎn)到點(diǎn)地址
獲取點(diǎn)到點(diǎn)地址
獲取廣播地址
設(shè)置廣播地址
獲取子網(wǎng)掩碼
設(shè)置子網(wǎng)掩碼
獲取接口的測(cè)度
設(shè)置接口的測(cè)度
獲取接口MTU
(還有很多取決于系統(tǒng)的實(shí)現(xiàn))
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
創(chuàng)建/修改ARP表項(xiàng)
獲取ARP表項(xiàng)
刪除ARP表項(xiàng)
struct arpreq
struct arpreq
struct arpreq
路
由
SIOCADDRT
SIOCDELRT
增加路徑
刪除路徑
struct rtentry
struct rtentry
流
I_xxx
套接口操作:
明確用于套接口操作的ioctl請(qǐng)求有三個(gè),它們都要求ioctl的第三個(gè)參數(shù)是指向某個(gè)整數(shù)的一個(gè)指針。
SIOCATMARK: 如果本套接口的的度指針當(dāng)前位于帶外標(biāo)記,那就通過由第三個(gè)參數(shù)指向的整數(shù)返回一個(gè)非0值;否則返回一個(gè)0值。POSIX以函數(shù)sockatmark替換本請(qǐng)求。
SIOCGPGRP: 通過第三個(gè)參數(shù)指向的整數(shù)返回本套接口的進(jìn)程ID或進(jìn)程組ID,該ID指定針對(duì)本套接口的SIGIO或SIGURG信號(hào)的接收進(jìn)程。本請(qǐng)求和fcntl的F_GETOWN命令等效,POSIX標(biāo)準(zhǔn)化的是fcntl函數(shù)。
SIOCSPGRP: 把本套接口的進(jìn)程ID或者進(jìn)程組ID設(shè)置成第三個(gè)參數(shù)指向的整數(shù),該ID指定針對(duì)本套接口的SIGIO或SIGURG信號(hào)的接收進(jìn)程,本請(qǐng)求和fcntl的F_SETOWN命令等效,POSIX標(biāo)準(zhǔn)化的是fcntl操作。
文件操作:
以下5個(gè)請(qǐng)求都要求ioctl的第三個(gè)參數(shù)指向一個(gè)整數(shù)。
FIONBIO: 根據(jù)ioctl的第三個(gè)參數(shù)指向一個(gè)0或非0值分別清除或設(shè)置本套接口的非阻塞標(biāo)志。本請(qǐng)求和O_NONBLOCK文件狀態(tài)標(biāo)志等效,而該標(biāo)志通過fcntl的F_SETFL命令清除或設(shè)置。
FIOASYNC: 根據(jù)iocl的第三個(gè)參數(shù)指向一個(gè)0值或非0值分別清除或設(shè)置針對(duì)本套接口的信號(hào)驅(qū)動(dòng)異步I/O標(biāo)志,它決定是否收取針對(duì)本套接口的異步I/O信號(hào)(SIGIO)。本請(qǐng)求和O_ASYNC文件狀態(tài)標(biāo)志等效,而該標(biāo)志可以通過fcntl的F_SETFL命令清除或設(shè)置。
FIONREAD: 通過由ioctl的第三個(gè)參數(shù)指向的整數(shù)返回當(dāng)前在本套接口接收緩沖區(qū)中的字節(jié)數(shù)。本特性同樣適用于文件,管道和終端。
FIOSETOWN: 對(duì)于套接口和SIOCSPGRP等效。
FIOGETOWN: 對(duì)于套接口和SIOCGPGRP等效。
接口配置:
得到系統(tǒng)中所有接口由SIOCGIFCONF請(qǐng)求完成,該請(qǐng)求使用ifconf結(jié)構(gòu),ifconf又使用ifreq
結(jié)構(gòu),如下所示:
Struct ifconf
{
int ifc_len; // 緩沖區(qū)的大小
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., “l(fā)e0”
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
再調(diào)用ioctl前我們必須先分撇一個(gè)緩沖區(qū)和一個(gè)ifconf結(jié)構(gòu),然后才初始化后者。如下圖
展示了一個(gè)ifconf結(jié)構(gòu)的初始化結(jié)構(gòu),其中緩沖區(qū)的大小為1024,ioctl的第三個(gè)參數(shù)指向
這樣一個(gè)ifconf結(jié)構(gòu)。
假設(shè)內(nèi)核返回2個(gè)ifreq結(jié)構(gòu),ioctl返回時(shí)通過同一個(gè)ifconf結(jié)構(gòu)緩沖區(qū)填入了那2個(gè)ifreq結(jié)構(gòu),ifconf結(jié)構(gòu)的ifc_len成員也被更新,以反映存放在緩沖區(qū)中的信息量。
本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u3/95416/showart_2030214.html |
|