ioctl引數詳解

2021-07-05 15:48:49 字數 4201 閱讀 8940

本函式影響由fd引數引用的乙個開啟的檔案。

#include

int ioctl( int fd, int request, ... );

返回0:成功 

-1:出錯

第三個引數總是乙個指標,但指標的型別依賴於request引數。

套介面操作  檔案操作 

介面操作 

arp快取記憶體操作 

路由表操作 

流系統類別request

說明資料型別套接

口siocatmark

siocspgrp

siocgpgrp

是否位於帶外標記

設定套介面的程序id或程序組id

獲取套介面的程序id或程序組id

intint

int 文

件fionbin

fioasync

fionread

fiosetown

fiogetown

設定/清除非阻塞i/o標誌

設定/清除訊號驅動非同步i/o標誌

獲取接收快取區中的位元組數

設定檔案的程序id或程序組id

獲取檔案的程序id或程序組id

intint

intint

int

口siocgifconf

siocsifaddr

siocgifaddr

siocsifflags

siocgifflags

siocsifdstaddr

siocgifdstaddr

siocgifbrdaddr

siocsifbrdaddr

siocgifnetmask

siocsifnetmask

siocgifmetric

siocsifmetric

siocgifmtu

sioc***

獲取所有介面的清單

設定介面位址

獲取介面位址

設定介面標誌

獲取介面標誌

設定點到點位址

獲取點到點位址

獲取廣播位址

設定廣播位址

獲取子網掩碼

設定子網掩碼

獲取介面的測度

設定介面的測度

獲取介面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

arpsiocsarp

siocgarp

siocdarp

建立/修改arp表項

獲取arp表項

刪除arp表項

struct arpreq

struct arpreq

struct arpreq路由

siocaddrt

siocdelrt

增加路徑

刪除路徑

struct rtentry

struct rtentry

流i_***

套介面操作:

明確用於套介面操作的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]; 

// inte***ce 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 inte***ce

再呼叫ioctl前我們必須先分撇乙個緩衝區和乙個ifconf結構,然後才初始化後者。如下圖

展示了乙個ifconf結構的初始化結構,其中緩衝區的大小為1024,ioctl的第三個引數指向

這樣乙個ifconf結構。

假設核心返回2個ifreq結構,ioctl返回時通過同乙個ifconf結構緩衝區填入了那2個ifreq結構,ifconf結構的ifc_len成員也被更新,以反映存放在緩衝區中的資訊量。

文章出處:飛諾網(www.firnow.com):

ioctl方法詳解

int ioctl struct inode struct file unsigned int,unsigned long 這是驅動程式裝置控制介面函式 ioctl函式 的核心原型定義,struct inode 和 struct file 描述了操作的檔案,unsigned int 描述了ioctl...

ioctl 函式詳解

int ioctl struct inode struct file unsigned int,unsigned long 這是驅動程式裝置控制介面函式 ioctl函式 的核心原型定義,struct inode 和 struct file 描述了操作的檔案,unsigned int 描述了ioctl...

ioctl引數命令設定

define scull ioc magic k define scull iocreset io scull ioc magic,0 define scull iocsquantum iow scull ioc magic,1,int define scull iocsqset iow scull...