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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ioctl函数

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

本函數影響由fd 參數引用的一個打開的文件。

?

#include<unistd.h>

int ioctl( int fd, int request, .../* void *arg */ );

返回0 :成功??? -1 :出錯

?

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

我們可以把和網絡相關的請求劃分為6 類:

套接口操作

文件操作

接口操作

ARP 高速緩存操作

路由表操作

流系統

下表列出了網絡相關ioctl 請求的request 參數以及arg 地址必須指向的數據類型:

?

類別

Request

說明

數據類型

SIOCATMARK

SIOCSPGRP

SIOCGPGRP

是否位于帶外標記

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

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

int

int

int

?

?

?

?

FIONBIN

FIOASYNC

FIONREAD

FIOSETOWN

FIOGETOWN

?

設置/ 清除非阻塞I/O 標志

設置/ 清除信號驅動異步I/O 標志

獲取接收緩存區中的字節數

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

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

int

int

int

int

int

?

?

?

?

?

?

?

?

?

?

?

?

?

?

SIOCGIFCONF

SIOCSIFADDR

SIOCGIFADDR

SIOCSIFFLAGS

SIOCGIFFLAGS

SIOCSIFDSTADDR

SIOCGIFDSTADDR

SIOCGIFBRDADDR

SIOCSIFBRDADDR

SIOCGIFNETMASK

SIOCSIFNETMASK

SIOCGIFMETRIC

SIOCSIFMETRIC

SIOCGIFMTU

SIOCxxx

獲取所有接口的清單

設置接口地址

獲取接口地址

設置接口標志

獲取接口標志

設置點到點地址

獲取點到點地址

獲取廣播地址

設置廣播地址

獲取子網掩碼

設置子網掩碼

獲取接口的測度

設置接口的測度

獲取接口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

?

ARP

SIOCSARP

SIOCGARP

SIOCDARP

創建/ 修改ARP 表項

獲取ARP 表項

刪除ARP 表項

struct arpreq

struct arpreq

struct arpreq

SIOCADDRT

SIOCDELRT

增加路徑

刪除路徑

struct rtentry

struct rtentry

I_xxx

?

?

?

?

套接口操作:

明確用于套接口操作的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];?????????? // 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 成員也被更新,以反映存放在緩沖區中的信息量

一般來講ioctl在用戶程序中的調用是: ioctl(int fd,int command, (char*)argstruct) ioctl調用與網絡編程有關(本文只討論這一點),文件描述符fd實際上是由socket()系統調用返回的。參數command的取值由/usr/include/linux/sockios.h 所規定。這些command的由于功能的不同,可分為以下幾個小類:
? 改變路由表 (例如 SIOCADDRT, SIOCDELRT),
? 讀/更新 ARP/RARP 緩存(如:SIOCDARP, SIOCSRARP),
? 一般的與網絡接口有關的(例如 SIOCGIFNAME, SIOCSIFADDR 等等)
在 Gooodies目錄下有很多樣例程序展示了如何使用ioctl。當你看這些程序時,注意參數argstruct是與參數command相關的。例如,與路由表相關的ioctl使用rtentry這種結構,rtentry定義在/usr/include/linux/route.h(參見例子 adddefault.c)。與ARP有關的ioctl調用使用arpreq結構,arpreq定義在/usr/include/linux /if_arp.h(參見例子arpread.c) 與網絡接口有關的ioctl調用使用的command參數通??雌饋硐馭IOCxIFyyyy的形式,這里x要么是S(設定set,寫write),要么是G(得到get,讀read)。在getifinfo.c程序中就使用了這種形式的command參數來讀 IP地址,硬件地址,廣播地址和得到與網絡接口有關的一些標志(flag)。在這些ioctl調用中,第三個參數是ifreq結構,它在/usr /include/linux/if.h中定義。在某些情況下, ioctrl調用可能會使用到在sockios.h之外的新的定義,例如,WaveLAN無線網絡卡會保

總結

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

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

主站蜘蛛池模板: 久久久久玖玖 | 免费网站在线观看人数在哪动漫 | 激情涩涩 | 黄色污污视频网站 | 欧美精品一区二区在线播放 | 久久天天东北熟女毛茸茸 | 欧美日韩国产一区二区三区在线观看 | 麻豆chinese新婚xxx | 久久白浆 | www视频在线观看 | 国产精品亚洲а∨天堂免在线 | 亚洲成人毛片 | 中文字幕成人网 | 国产视频福利在线观看 | 姑娘第5集在线观看免费好剧 | 明日花绮罗高潮无打码 | 免费观看av | 久久大胆视频 | 久久在线精品 | 成年人在线播放视频 | 久成人| 97在线超碰 | 91色偷偷| 日本美女毛茸茸 | 一级片一区 | 亚洲国产丝袜 | 午夜男人天堂 | jzjzjz欧美丰满少妇 | 欧美在线一级 | 亚洲高清在线观看视频 | 日韩免费成人av | 大尺度做爰啪啪床戏 | 成人乱人乱一区二区三区 | 欧美日韩啪啪 | 人妻偷人精品一区二区三区 | 六月综合| 亚洲精品一线二线三线 | 嫩草影院懂你的影院 | 手机看片一区二区三区 | 丰满双乳秘书被老板狂揉捏 | 三级av片 | 日韩一级色 | 国产成人在线精品 | 日本三级欧美三级 | 成人av影院在线观看 | wwwav在线播放 | 欧美va亚洲va | 91国内精品野花午夜精品 | chinesepron hd videos国产91 | 中国女人特级毛片 | 日本一区二区色 | 快射视频在线观看 | 可以直接看的毛片 | 久久久久亚洲AV成人无码国产 | 不卡的av片 | 亚洲深夜视频 | 亚洲一区二区免费在线观看 | 草草视频在线观看 | 熟睡侵犯の奶水授乳在线 | 日韩免费高清一区二区 | 国产五区| 国产调教视频 | 欧美片免费网站 | 亚洲一二三在线 | 亚洲靠逼 | 日日夜夜爱 | 日本在线加勒比 | 国产黄色片在线免费观看 | 蜜臀av一区二区 | 美丽的姑娘观看在线播放 | 亚洲综合图色40p | 国产精品久久久久久久av | 国产精品wwww| 男女午夜网站 | 免费成人电影在线观看 | 国产三区在线观看 | 日本高清有码 | 奶罩不戴乳罩邻居hd播放 | 95国产精品 | 成人av网站在线播放 | 少妇av一区二区三区无码 | 免费精品在线视频 | 精精国产xxxx视频在线 | 中文字幕h| 欧美成人aa| 黄视频在线 | 亚洲福利精品视频 | 禁断介护老人中文字幕 | 亚洲伊人成人网 | 超碰96在线| 老熟妇仑乱视频一区二区 | 黄色片免费看 | 91精品国产91久久久久福利 | 激情视频网站在线观看 | 天堂网在线资源 | 女人喂男人奶水做爰视频 | 超碰免费观看 | 91在线视频免费观看 | gogo亚洲国模私拍人体 |