ioctl函式操作型別

2021-06-08 19:52:07 字數 4681 閱讀 1818

來自百科:

函式名: ioctl

標頭檔案:#include

功 能: 控制i/o裝置 ,提供了一種獲得裝置資訊和向裝置傳送控制引數的手段。用於向裝置發控制和配置命令 ,有些命令需要控制引數,這些資料是不能用read / write 讀寫的,稱為out-of-band資料。也就是說,read / write 讀寫的資料是in-band資料,是i/o操作的主體,而ioctl 命令傳送的是控制資訊,其中的資料是輔助的資料。

用 法: int ioctl(int handle, int cmd,[int *argdx, int argcx]);

返回值:成功為0,出錯為-1

套介面操作:

明確用於套介面操作的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 ifconfifc_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 ifreqifr_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成員也被更新,以反映存放在緩衝區中的資訊量。

介面操作:

siocgifconf請求為每個已配置的介面返回其名字以及乙個套介面位址結構。我們接著可以發出多個介面類其他請求以設定或獲取每個介面的其他特徵。這些請求的獲取(get)版本(siocg***)通常由netstat程式發出,設定(set)版本(sigocs***)通常由ifconfig程式發出。任何使用者都可以獲取介面資訊,設定介面資訊卻要求有超級使用者許可權。

這些請求汲取或返回乙個乙個ifreq結構中的資訊,而這個結構的位址則作為ioctl呼叫的第三個引數制定。介面總是以其名標誌,在ifreq結構的ifr_name成員中指定,如le0,lo0,ppp0等。

這些請求中有許多使用套介面位址結構在應用程序和核心之間指定或返回具體介面的ip位址或位址掩碼。對於ipv4,這個位址或掩碼放在乙個網際套介面位址結構的sin_addr成員中;對於ipv6,它是乙個ipv6套介面位址結構的sin6_addr成員。

siocgifaddr:  在ifr_addr成員中返回單播位址。

siocsifaddr:用ifr_addr成員設定介面位址,這個介面的初始化函式也被呼叫。

siocgifflags:在ifr_flags成員中返回介面標誌。這些介面標誌的名字格式為iff_***,在標頭檔案中定義。舉例來說,這些標誌指示介面是否處於up即在工狀態(iff_up),是否為乙個點到點介面(iff_pointopoint),是否支援廣播(iff_broadcast),等等。

siocsifflags:用ifr_flags成員設定介面標誌。

siocgifdstaddr:在ifr_dstaddr成員中返回點到點位址。

siocsifdstaddr:  在ifr_dstaddr成員中設定點到點位址

siocgifbrdaddr:  在ifr_broadaddr成員中返回廣播位址。應用程序必須首先獲取介面標誌,然後發出正確的請求;對於廣播介面為siocgifbrdaddr,對於點到點介面為siocgifdstaddr

siocsifbrdaddr:用ifr_broadaddr成員設定廣播位址。

siocgifnetmask:在ifr_addr成員中返回子網掩碼。

siocsifnetmask:在ifr_addr成員中設定子網掩碼。

siocgifmetric:用ifr_metric成員返回介面測度。介面測度由核心為每個介面維護,不過使用他的是路由守護程序routed。介面測度被routed加到跳數上。

siocsifmetric:用ifr_metric成員設定介面的路由測度。

arp快取記憶體操作

arp告訴快取也通過ioctl函式操縱。使用路由域套介面的系統往往改用路由套介面訪問

arp快取記憶體。這些請求使用如下的arpreq結構,定義在

struct arpreq ;

#define atf_inuse      0x01   //entry in use

#define atf_com         0x02   //completed entry (hardware addr valid)

#define atf_perm       0x04   // permanent entry

#define atf_publ 0x08   // published entry (respond for other host )

ioctl的第三個必須指向某個arpreq結構,操縱arp快取記憶體的ioctl請求有以下三個:

siocsarp:           把乙個新的表項加入arp告訴快取中區,或者修改其中已經存在的乙個表項,其中arp_pa是乙個含有ip位址的網際套介面位址結構,arp_ha則是乙個通用套介面位址結構,他的sa_family值為af_unspec,sa_data中含有硬體位址(例如6直接的乙太網位址)。atf_perm和atf_publ這兩個標誌也可以由應用程序指定。另外兩個標誌(atf_inuse和atf_com)則由核心設定。

siocdarp:        從arp告訴快取中刪除乙個表項。呼叫者指定要刪除表項的網際位址。

siocgarp:        從arp快取記憶體中獲取乙個表項。呼叫者指定網際位址,相應的硬體位址(例外乙太網位址)隨標誌一起返回。

只有超級使用者才能增加或刪除表項。這三個請求通常由arp程式發出。

注意ioctl沒有辦法列出arp快取記憶體中的所有表項。當指定-a標誌執行arp命令時,大多

數版本的arp程式通過讀取核心的記憶體( /dev/kmem )獲得arp快取記憶體的當前內容。

路由表操作 

有些系統提供2個用於操縱路由表的ioctl請求。這2個請求要求ioctl的第三個引數是指向某個rtentry結構的乙個指標,該結構定義在標頭檔案中。這些請求通常由route

程式發出。只有超級使用者才能發出這些請求。

siocaddrt:往路由表中增加乙個表項

siocdelrt:從路由表中刪除乙個表項

ioctl沒有辦法列出路由表中的所有表項。這個操作通常由netstat程式在指定-r標誌自行四完成。netstat程式通過讀取核心的記憶體  (/dev/kmem)獲得整個路由表。用sysctl同樣可以做到。

ioctl函式介紹

我這裡說的ioctl函式是在驅動程式裡的,因為我不知道還有沒有別的場合用到了ioctl,所以就規定了我們討論的範圍。為什麼要寫篇文章呢,是因為我前一陣子被ioctl給搞混 了,這幾天才弄明白它,於是在這裡清理一下頭腦。一 什麼是ioctl。ioctl是裝置驅動程式中對裝置的i o通道進行管理的函式。...

ioctl 函式詳解

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

ioctl函式用法小記

by francis hao aug 27,2017 unpv1對ioctl有算是比較詳細的介紹,但是,這些request和後面的資料型別是從 來的,以及引數具體該如何使用呢?本文嘗試在不借助書籍,而僅僅使用linux系統下的資源編寫可行的呼叫ioctl的程式。ioctl 控制裝置 include ...