ioctl函数

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

#include

intioctl( 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参数通常看起来像SIOCxIFyyyy的形式,这里x要么是S(设定set,写write),要么是G(得到get,读read)。在getifinfo.c程序中就使用了这种形式的command参数来读IP地址,硬件地址,广播地址和得到与网络接口有关的一些标志(flag)。在这些ioctl调用中,第三个参数是ifreq结构,它在/usr /include/linux/if.h中定义。在某些情况下,ioctrl调用可能会使用到在sockios.h之外的新的定义,例如,WaveLAN无线网络卡会保

java ioctl,ioctl函数详细说明相关推荐

  1. java之map函数详细分析(全)

    目录 前言 函数方法 Map.Entry函数 实战演练 前言 "键值"对映射的抽象接口.该映射不包括重复的键,一个键对应一个值 函数方法 1.实例化一个对象 Map<Inte ...

  2. java addslashes_php addslashes 函数详细分析说明

    语法: string addslashes(string str); 内容说明 本函数使需要让数据库处理的字符串中引号的部份加上斜线,以供数据库查询 (query) 能顺利运作.这些会被改的字符包括单 ...

  3. linux ioctl 设备操作函数 r3到r0 应用层 驱动层 通讯

    一.ioctl的简介: 虽然在文件操作结构体"struct file_operations"中有很多对应的设备操作函数,但是有些命令是实在找不到对应的操作函数.如CD-ROM的驱动 ...

  4. java消费者模式_基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...

  5. java 柯里化_函数式编程(Java描述)——Java中的函数及其柯里化

    本文继续上一篇的内容 在Java中,函数可以表现为一个普通的方法.一个lambda表达式,又或者方法引用,甚至是匿名类.本文不会介绍匿名类这种形式. 方法 Java中的方法,Java使用方法这一概念来 ...

  6. java字符替换函数示例_Java字符串替换函数replace()用法解析

    Java字符串替换函数replace()用法解析 这篇文章主要介绍了Java字符串替换函数replace()用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的 ...

  7. lambda函数 java_使用 Java 构建 Lambda 函数 - AWS Lambda

    本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. 使用 Java 构建 Lambda 函数 您可以在 AWS Lambda 中运行 Java 代码.Lambda 为运行代码 ...

  8. java秃顶_【本人秃顶程序员】在Java中使用函数范式提高代码质量

    ←←←←←←←←←←←← 快!点关注 在一个范式和技术堆栈一直在变化的世界中,保持竞争力和提高生产力和质量的斗争有时候证明是一项挑战. 在本文中,我想首先展示一下函数编程(FP)的优势,特别是加强Ja ...

  9. java lam表达式_详细分析Java Lambda表达式

    在了解Lambda表达式之前我们先来区分一下面向对象的思想和函数式编程思想的区别 面向对象的思想: 做一件事情,找一个能解决这个事情的对象,调用他的方法来解决 函数时编程思想: 只要能获取到结果,谁去 ...

  10. linux 内核flush,armv8(aarch64)linux内核中flush_dcache_all函数详细分析

    /* *  __flush_dcache_all() *  Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...

最新文章

  1. JavaScript两个数组是否有相同元素
  2. 【Python】简单的最优算法函数创建
  3. tp和 vue 管理后台管理系统_vue-antd后台管理系统
  4. javascript高级程序设计 学习笔记 第五章 上
  5. 图解 IDEA 中 springboot 项目 MyBatis Generator 逆向生成实体类及 mapper 配置文件
  6. 利用 Celery 构建 Web 服务的后台任务调度模块
  7. c++思维导图_40+张最全Linux/C/C++思维导图,你确定不收藏?
  8. c++ 数组置0_09c语言数组详解
  9. 【服务器】宝塔部署eoLinker开源版
  10. 柳暗花明 | 海归小硕的求职之路
  11. python gui哪个好看_python的GUI选择什么方案比较好?
  12. sg nc的java下载,01_SG-NC-客户端安装说明及培训材料下载 3
  13. sqlserver 当月、 时间_SQLServer取系统当前时间
  14. 联通光猫型号: 吉比特GPON/4+1+WiFi2.5
  15. 端口已被占用1080(解决方案)
  16. 迁移学习在金融行业的应用探索
  17. 深度学习英文缩写_深度学习相关专业词汇简称汇总
  18. Http请求加密规则(3DES、Base64、HMAC SHA256)
  19. GitHub标星8k!java正则数字
  20. webgl_浏览器支持问题

热门文章

  1. MT6625L处理器参数规格
  2. 北京生存日记 Day one
  3. python中偶数怎么表示_Python程序可计算列表中的偶数和奇数
  4. 做好客户关系维护,你只需要一个CRM系统
  5. 打印分页,window.print() 打印分页
  6. 学习笔记九:BERT和它的小伙伴们
  7. 媒体宣传的优势与重要性
  8. 《寒假去世十 第一章》
  9. 实现同时加载大量大图里,由马马赛克变清晰过程方法
  10. Python数据可视化实战 (附Python代码)