日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ioctl操作

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ioctl操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ioctl操作 傳統上ioctl函數是用于那些普遍使用,但不適合歸入其他類別的任何特性的系統接 口。Posix去掉了ioctl,它通過 創建特殊的其功能已被Posix標準化的包裹函數來代替ioctl。這一章介紹和網絡 編程有關的ioctl操作。 1. ioctl函數 int ioctl(int d, int request, ...); 和網絡有關的ioctl請求有6類: 套接口操作 文件操作 接口操作 ARP高速緩存操作 路由表操作 流系統 2. 套接口操作
類別請求描述數據類型
套接口SIOCATMASK在帶外標志上嗎int
?SIOCSPGRP設置套接口的進程ID和進程組IDint
?SIOCGPGPR獲取套接口的進程ID和進程組IDint
SIOCATMASK: 如果套接口的讀指針在帶外標志上,則通過第三個參數指向的整數返回一個非零值,否則返回零。 3. 文件操作
類別請求描述數據類型
文件操作FIONBIO設置/清除非阻塞標志int

FIOASYNC設置/清除異步I/O標志int

FIONREAD獲取接收緩沖區中數據的字節數int

FIOSETOWN設置文件的進程ID或進程組IDint

FIOGETOWN獲取文件的進程ID或進程組IDint
FIONBIO: 這個請求和用fcntl的F_SETFL命令設置和清除O_NONBLOCK標志效果相同。 4. 接口配置
類別請求描述數據類型
接口SIOCGIFCONF獲取所有接口的列表struct ifconf

SIOCSIFADDR設置接口地址struct ifreq

SIOCGIFADDR獲取接口地址struct ifreq

SIOCSIFFLAGS設置接口標志struct ifreq

SIOCGIFFLAGS獲取接口標志struct ifreq

SIOCSIFDSTADDR設置點對點地址struct ifreq

SIOCGIFDSTADDR獲取點對點地址struct ifreq

SIOCGIFBRDADDR獲取廣播地址struct ifreq

SIOCSIFBRDADDR設置廣播地址struct ifreq

SIOCGIFNETMASK獲取子網掩碼struct ifreq

SIOCSIFNETMASK設置子網掩碼struct ifreq

SIOCGIFMETRIC獲取接口的測度(metric)struct ifreq

SIOCSIFMETRIC設置接口的測度(metric)struct ifreq

SIOCxxx

5. ARP
類別請求描述數據類型
ARPSIOCSARP創建/修改ARP項struct arpreq

SIOCGARP獲取ARP項struct arpreq

SIOCDARP刪除ARP項struct arpreq
6. 路由
類別請求描述數據類型
路由SIOCADDRT增加路徑struct rtentry

SIOCDELRT刪除路徑struct rtentry

=====================================================================================================

套接口ioctl函數

#include <unistd.h>
int ioctl(int fd, int request, … /* void *arg */ );
返回:成功返回0,出錯返回-1。

第三個參數總是一個指針,但指針的類型依賴于request。

ioctl和網絡有關的請求可分為如下6類:

類別request描述數據類型




套接口SIOCATMARK在帶外標志上嗎int

SIOCSPGRP設置套接口的進程ID或進程組IDint

SIOCGPGRP獲取套接口的進程ID或進程組IDint




文件FIONBIO設置/清除非阻塞標志int

FIOASYNC設置/清除異步I/O標志int

FIONREAD獲取接收緩沖區中的字節數int

FIOSETOWN設置文件的進程ID或進程組IDint

FIOGETOWN獲取文件的進程ID或進程組IDint




接口SIOCGIFCONF獲取所有接口的列表struct?ifconf

SIOCSIFADDR設置接口地址struct?ifreq

SIOCGIFADDR獲取接口地址struct?ifreq

SIOCSIFFLAGS設置接口標志struct?ifreq

SIOCGIFFLAGS獲取接口標志struct?ifreq

SIOCSIFDSTADDR設置點到點地址struct?ifreq

SIOCGIFDSTADDR獲取點到點地址struct?ifreq

SIOCGIFBRDADDR??獲取廣播地址struct?ifreq

SIOCSIFBRDADDR設置廣播地址struct?ifreq

SIOCGIFNETMASK獲取子網掩碼struct?ifreq

SIOCSIFNETMASK設置子網掩碼struct?ifreq

SIOCGIFMETRIC獲取接口的測度(metric)struct?ifreq

SIOCSIFMETRIC設置接口的測度(metric)struct?ifreq

SIOCxxx(有很多,依賴于實現)




ARPSIOCSARP創建/修改ARP項struct?arpreq

SIOCGARP獲取ARP項struct?arpreq

SIOCDARP刪除ARP項struct?arpreq




路由SIOCADDRT增加路徑struct?rtentry

SIOCDELRT刪除路徑struct?rtentry




I_xxx

?

?

(1)套接口操作

  • SIOCATMARK:如果套接口的讀指針當前在帶外標志上,則通過第三個參數指向的整數返回一個非零值,否則返回零。Posix.1g 用sockatmark代替了這種請求。
  • SIOCGPGRP:通過第三個參數指向的整數返回為接收來自這個套接口的SIGIO或SIGURG信號而設置的進程ID或進程組ID。 這和fcntl的F_GETOWN相同。
  • SIOCSPGRP:用第三個參數指向的整數設置進程ID或進程組ID以接收這個套接口的SIGIO或SIGURG信號。這和fcntl 的F_SETOWN相同。

(2)文件操作

  • FIONBIO:套接口的非阻塞標志會根據第三個參數指向的值是否為零而清除或設置。等價于fcntl的F_SETFL設置/清除 O_NONBLOCK標志。
  • FIOASYNC:根據第三個參數指向的值是否為零決定清除或接收套接口上的異步I/O信號。等價于fcntl的F_SETFL設置和清 除O_AYNC標志。
  • FIONREAD:在第三個參數指向的整數中返回套接口接收緩沖區中當前的字節數。
  • FIOSETOWN:在套接口上等價于SIOCSPGRP。
  • FIOGETOWN:在套接口上等價于SIOCGPGRP。

(3)接口配置

SIOCGIFCONF:從內核中獲取系統中配置的所有接口。它使用了結構ifconf,ifconf又使用了ifreq結構。

結構定義如下:
struct?ifconf {
???? int ifc_len; /* size of buffer, value-result */
???? union {
???????? caddr_t ifcu_buf; /* input from user->kernel */
?????????struct?ifreq?*ifcu_req; /* return from kernel->user */
???? }ifc_ifcu;
};
#define ifc_buf ifc_ifcu.ifcu_buf
#define ifc_req ifc_ifcu.ifcu_req
#define IFNAMSIZ 16

struct?ifreq?{
???? char ifr_name[IFNAMSIZ];
???? 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
#define ifr_dstaddr ifr_ifru.ifru_dstaddr
#define ifr_broadaddr ifr_ifru.broadaddr
#define ifr_flags ifr_ifru.ifru_flags
#define ifr_metric ifr_ifru.ifru_metric
#define ifr_data ifr_ifru.ifru_data

在調用ioctl之前分配一個緩沖區和一個ifconf結構,然后初始化后者,iotctl的第三個參數指向ifconf結構。

一個實現獲取所有接口的程序,可參見unpv12e:lib/get_ifi_info.c

?

?

(4)接口操作

  • SIOCGIFCONF:從內核中獲取系統中配置的所有接口。

(5)ARP高速緩存操作

(6)路由表操作

=====================================================================================================

NAME

netdevice - 底層訪問 Linux 網絡設備.

總覽 (SYNOPSIS)

#include <sys/ioctl.h>?
#include <net/if.h>

描述 (DESCRIPTION)

本手冊 描述 用于 配置 網絡設備 的 套接字(socket) 接口.

Linux 支持 一些 配置 網絡設備 的 標準 ioctl. 他們 用于 任意的 套接字 描述符, 而 無須 了解 其 類型 或 系列. 他們 傳遞 一個?ifreq?結構:

struct ifreq
{
char ifr_name[IFNAMSIZ]; /* Interface name */
union {
struct sockaddr ifr_addr;
struct sockaddr ifr_dstaddr;
struct sockaddr ifr_broadaddr;
struct sockaddr ifr_netmask;
struct sockaddr ifr_hwaddr;
short ifr_flags;
int ifr_ifindex;
int ifr_metric;
int ifr_mtu;
struct ifmap ifr_map;
char ifr_slave[IFNAMSIZ];
char ifr_newname[IFNAMSIZ];
char * ifr_data;
};
}

struct ifconf
{
int ifc_len; /* size of buffer */
union {
char * ifc_buf; /* buffer address */
struct ifreq *ifc_req; /* array of structures */
};
};

一般說來, ioctl 通過 把?ifr_name?設置為 接口 的 名字 來 指定 將要 操作 的 設備. 結構的 其他成員 可以 分享 內存.

IOCTLS

如果 某個 ioctl 標記為 特權操作, 那么 操作時 需要 有效uid 為 0, 或者 擁有?CAP_NET_ADMIN?能力. 否則 將 返回?EPERM .

?

SIOCGIFNAME
給定?ifr_ifindex,?返回?ifr_name?中 的 接口名字. 這是 唯一 返回?ifr_name?內容 的 ioctl.
SIOCGIFINDEX
把 接口 的 索引 存入?ifr_ifindex.
SIOCGIFFLAGS,?SIOCSIFFLAGS
讀取 或 設置 設備的 活動標志字.?ifr_flags?包含 下列值 的 屏蔽位:

?

設備標志
IFF_UP接口正在運行.
IFF_BROADCAST有效的廣播地址集.
IFF_DEBUG內部調試標志.
IFF_LOOPBACK這是自環接口.
IFF_POINTOPOINT這是點到點的鏈路接口.
IFF_RUNNING資源已分配.
IFF_NOARP無arp協議, 沒有設置第二層目的地址.
IFF_PROMISC接口為雜湊(promiscuous)模式.
IFF_NOTRAILERS避免使用trailer .
IFF_ALLMULTI接收所有組播(multicast)報文.
IFF_MASTER主負載平衡群(bundle).
IFF_SLAVE從負載平衡群(bundle).
IFF_MULTICAST支持組播(multicast).
IFF_PORTSEL可以通過ifmap選擇介質(media)類型.
IFF_AUTOMEDIA自動選擇介質.
IFF_DYNAMIC接口關閉時丟棄地址.

?

設置 活動標志字 是 特權操作, 但是 任何進程 都可以 讀取 標志字.

SIOCGIFMETRIC,?SIOCSIFMETRIC
使用?ifr_metric?讀取 或 設置 設備的 metric 值. 該功能 目前 還沒有 實現. 讀取操作 使?ifr_metric?置 0, 而 設置操作 則 返回?EOPNOTSUPP.
SIOCGIFMTU,?SIOCSIFMTU
使用?ifr_mtu?讀取 或 設置 設備的 MTU(最大傳輸單元). 設置 MTU 是 特權操作. 過小的 MTU 可能 導致 內核 崩潰.
SIOCGIFHWADDR,?SIOCSIFHWADDR
使用?ifr_hwaddr?讀取 或 設置 設備的 硬件地址. 設置 硬件地址 是 特權操作.
SIOCSIFHWBROADCAST
使用?ifr_hwaddr?讀取 或 設置 設備的 硬件廣播地址. 這是個 特權操作.
SIOCGIFMAP,?SIOCSIFMAP
使用?ifr_map?讀取 或 設置 接口的 硬件參數. 設置 這個參數 是 特權操作. struct ifmap
{
unsigned long mem_start;
unsigned long mem_end;
unsigned short base_addr;
unsigned char irq;
unsigned char dma;
unsigned char port;
};

對 ifmap 結構 的 解釋 取決于 設備驅動程序 和 體系結構.

SIOCADDMULTI,?SIOCDELMULTI
使用?ifr_hwaddr?在 設備的 鏈路層 組播過濾器 (multicase filter) 中 添加 或 刪除 地址. 這些是 特權操作. 參看?packet(7).
SIOCGIFTXQLEN,?SIOCSIFTXQLEN
使用?ifr_qlen?讀取 或 設置 設備的 傳輸隊列長度. 設置 傳輸隊列長度 是 特權操作.
SIOCSIFNAME
把?ifr_ifindex?中 指定的 接口名字 改成?ifr_newname. 這是個 特權操作.
SIOCGIFCONF
返回 接口地址(傳輸層) 列表. 出于 兼容性, 目前 只代表 AF_INET 地址. 用戶 傳送 一個?ifconf?結構 作為 ioctl 的 參數. 其中?ifc_req?包含 一個 指針 指向?ifreq?結構數組, 他的 長度 以字節 為單位 存放在?ifc_len?中. 內核 用 所有 當前的 L3(第三層?) 接口地址 填充 ifreqs, 這些 接口 正在 運行:?ifr_name?存放 接口名字 (eth0:1等),?ifr_addr?存放 地址. 內核 在?ifc_len?中 返回 實際長度; 如果 他 等于 初始長度, 表示 溢出了, 用戶 應該 換一個 大些的 緩沖區 重試 一下. 沒有 發生 錯誤時 ioctl 返回 0, 否則 返回 -1, 溢出 不算 錯誤.

轉載于:https://www.cnblogs.com/p2liu/archive/2010/08/06/6048827.html

總結

以上是生活随笔為你收集整理的ioctl操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。