本函数影响由fd参数引用的一个打开的文件。

#include

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结构。

假设内核返回2个ifreq结构,ioctl返回时通过同一个ifconf结构缓冲区填入了那2个ifreq结构,ifconf结构的ifc_len成员也被更新,以反映存放在缓冲区中的信息量。

c语言 ioctl,ioctl参数详解相关推荐

  1. ioctl 函数 参数 详解

    2019独角兽企业重金招聘Python工程师标准>>> ioctl 函数 参数 详解 2009-04-24 11:55 ioctl函数 本函数影响由fd参数引用的一个打开的文件. # ...

  2. C语言传递可变参数详解

    C语言传递可变参数详解 1.可变参数详解 在有些情况下,我们需要传递的参数的个数是可变的.C 语言为这种情况提供了一个解决方案,它允许定义一个函数,能根据具体的需求接受可变数量的参数.可以使编程更加的 ...

  3. c语言main函数参数详解,c/c++程序main函数参数解析,以及参数传递的不同方法

    1. 程序运行时传递参数的不同方法: 1)通过命令参数传递参数: 2) 通过txt文件读取参数. 2. 方法举例 1)通过命令参数传递参数,即解析main函数的参数. main函数可以不带参数,也可以 ...

  4. C语言main函数参数详解

    main函数参数 一共有三个: 1.int argc 整型变量 2.char *argv[] 字符指针的数组,通俗一点就是字符串数组,每个元素都是字符串 3.char *envp[] 字符串数组 这三 ...

  5. C语言命令行参数详解

    C语言的main函数通常含有参数argc和argv,写法通常如下: int main(int argc,char *argv[]) int main(int argc,char **argv) 下面详 ...

  6. R语言axis函数参数详解(坐标轴函数)

    首先我们来看一下函数帮助文档所给定的axis函数参数: axis(side, at = NULL, labels = TRUE, tick = TRUE, line = NA,pos = NA, ou ...

  7. c语言fopen函数的作用是,C语言 fopen函数 参数详解

    文件打开函数fopenfopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式) 其中,"文件指针名"必须是被说明为FILE 类型的指针变 ...

  8. ioctl函数详解(参数详解,驱动unlocked_ioctl使用、命令码如何封装)

    @ioctl函数详解 一.ioctl函数的原型 在用户空间的函数原型 #include <sys/ioctl.h> int ioctl(int d, int request, ...); ...

  9. linux 文件 字符集设置,Linux字符集和系统语言设置-LANG,locale,LC_ALL,POSIX等命令及参数详解...

    博文说明[前言]: 本文将通过个人口吻介绍Linux字符集和系统语言设置,包括LANG,locale,LC_ALL,POSIX等命令及参数详解的相关知识,在目前时间点[2017年6月21号]下,所掌握 ...

  10. C语言 printf格式化输出,参数详解

    有关输出对齐 int main(int argc, char* argv[]) {  char insertTime[20] = {"1234567890"};  double i ...

最新文章

  1. 【知识强化】第一章 操作系统概述 1.1 操作系统的基本概念
  2. 用android LinearLayout和RelativeLayout实现精确布局(转)
  3. 前端学习(2971):静态打包资源
  4. Win11系统显示你的账户已被停用怎么办
  5. Vue首屏加载白屏问题及解决方案
  6. SpringCloud工作笔记040---zuul网关集合springsecurity_JWT 颁发token_但是Authorization无法传递到response的header中
  7. python列表的排序方法_Python 列表 sort() 方法
  8. MIUI 12 的方向走错了吗?
  9. python 错误类型及解释
  10. Web开发技术架构图
  11. 拼多多直通车有作用?新手为什么不适合开直通车?
  12. C语言输入汉字并输出
  13. zblog include html页面,zblog模板开发第一课:zblog标签调用大全
  14. [0CTF 2016]piapiapia BUUCTF 详细writeup
  15. 裸辞闹了个乌龙,就当做个题提升自己吧
  16. 揭秘曝光所有互联网赚钱的秘密及方法
  17. 笔记本电脑同时连接内外网
  18. Java开发专家阿里P6-P7面试题大全及答案汇总(持续更新)
  19. 电商技术架构演进过程——具体到每一个技术
  20. vue打包出来的dist如何查看js的占比,report生成分析图

热门文章

  1. java时间复杂度计算_时间复杂度到底怎么算
  2. Android debug.apk在别的手机上 闪退 ClassNotFoundException 直接Run正常
  3. 五年制专科生走向IT技术岗位的学习路线
  4. 非法提供控制计算机程序罪,XX提供非法控制计算机信息系统程序罪怎么判?
  5. django-channels(websocket)
  6. NAT-T:IPsec穿越NAT之道
  7. Tradingview做好交易图表工具(一)
  8. python与bim_BIM轻量化之路(二)
  9. 【Gensim + TSNE使用】word2vec词向量处理中文小说 (词嵌入、高维数据降维)
  10. [matlab]normrnd和randn的区别