`
shaojiashuai123456
  • 浏览: 262119 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

ioctl 函数 --转

 
阅读更多

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

<script type="text/javascript"></script>

分享到:
评论

相关推荐

    详细介绍哦ioctl函数用法, 一看必然会用。。。。

    ioctl 函数用法详解 ioctl 函数是一个系统调用函数,用于控制设备或文件描述符的参数。它可以用来执行各种操作,如获取或设置设备参数、执行设备命令、获取或设置文件描述符的参数等。 在 Linux 系统中,ioctl ...

    ioctl函数的使用

    ioctl函数的使用 Ioctl函数是一种控制I/O设备的函数,主要用来控制设备的行为和交互。Ioctl函数的使用可以分为两个方面:一是控制I/O设备的行为,二是交互数据传输。 在include/asm/ioctl.h头文件中,定义了 ioctl...

    linux下ioctl函数

    "Linux 下的 ioctl 函数" ioctl 函数是 Linux 驱动程序中对设备的 I/O 通道进行管理的函数,它可以控制设备的一些特性,例如串口的传输波特率、马达的转速等等。ioctl 函数的调用格式为 int ioctl(int fd, int cmd,...

    ioctl函数详解

    ### ioctl函数详解:深入理解设备控制的核心机制 在Linux系统编程中,`ioctl`函数扮演着设备控制的关键角色。本文将全面解析`ioctl`函数的工作原理、如何在内核模块中实现以及其在用户空间与内核空间通信中的重要性...

    linux下ioctl函数 (2).docx

    "Linux下的ioctl函数详解" Linux操作系统中,ioctl函数是一个非常重要的概念,它是设备驱动程序中对设备的I/O通道进行管理的函数。下面,我们将详细讨论ioctl函数的定义、必要性、实现方式、cmd参数的生成等方面。 ...

    ioctl 函数的用法打包

    ioctl函数在Linux操作系统中扮演着重要的角色,它是设备驱动程序和应用程序之间进行通信的主要机制之一。这个函数允许用户空间的应用程序对设备进行控制操作,比如配置硬件参数、获取设备状态等,而不仅仅是简单的...

    IOCTL函数与网络接口[整理].pdf

    IOCTL函数与网络接口[整理].pdf

    linux系统ioctl使用示例

    ioctl 函数可以用来设置或获取设备文件的属性、控制设备的行为、执行特殊的 I/O 操作等。 在以下四个示例程序中,我们将展示如何使用 ioctl 来检测接口的 inet_addr、netmask、broad_addr,检查接口的物理连接是否...

    ioctl函数.pdf

    ioctl 函数详解 ioctl 函数是 Unix 操作系统中用于控制设备的输入/输出操作的函数。它可以影响由 fd 参数引用的一个打开的文件。该函数的原型为: `int ioctl(int fd, int request, .../* void *arg */ );` 其中...

    重要知识ioctl函数.pdf

    ioctl 函数详解 ioctl 函数是一个重要的系统调用函数,它可以控制和查询文件描述符相关的信息。该函数的原型为: `int ioctl(int fd, int request, .../* void *arg */);` 其中,`fd` 是一个打开的文件描述符,`...

    高级字符驱动(llseek以及ioctl函数)[参考].pdf

    高级字符驱动(llseek和ioctl函数) 一、高级字符驱动概述 高级字符驱动是指设备驱动程序中除了基本的读写能力外,还需要进行其他硬件控制操作的能力。这种能力通常通过ioctl函数来实现。 二、ioctl函数 ioctl函数...

    IOCTL函数与网络接口.pdf

    IOCTL函数与网络接口.pdf

    IOCTL_CODE 计算器

    IOCTL代码由四个部分组成,分别是函数类、功能码、访问类型和设备类型。这四个部分都是无符号整数,并按照特定的方式组合成一个32位或64位的值。函数类通常表示驱动程序的主要功能,如磁盘、键盘或鼠标操作。功能码...

    ioctl函数[参考].pdf

    `ioctl`函数是Unix-like操作系统中用于控制设备和获取设备状态的重要函数。它允许程序员对文件描述符(如网络套接字、磁盘文件等)进行低级别的操作,执行特定设备驱动程序支持的操作。`ioctl`函数的原型如下: ```...

    ioctl系统调用流程

    4. sys_ioctl函数:sys_ioctl函数是整个ioctl系统调用过程中的最顶级函数。它需要对输入的参数进行预处理,检查参数的合法性,然后调用底层的处理函数作更进一步的处理。 ioctl系统调用流程是一个复杂的过程,涉及...

    NIOS的常用函数-很详尽

    而`alt_dma_rxchan_ioctl`函数提供了对DMA接收信道的I/O控制,允许设置传输模式和其他特定参数。例如,可以通过此函数切换传输数据的宽度,如8位、16位、32位等,并可以设置接收信道的行为,如只接收或只发送。 ...

    drm_ioctl-.rar_drm linux

    在Linux内核中,ioctl函数用于处理特定的设备操作,这些操作不通过常规的读写系统调用完成。在DRM上下文中,ioctl调用可能包括设置显示模式、分配和管理帧缓冲、设置渲染状态等。`drm_ioctl.c`通常包含了大量的ioctl...

    ioctl-sample.zip_io driver_ioctl_ioctl kb m_过滤驱动_过滤驱动程序

    ioctl函数在内核中定义了一种灵活的方式,以处理各种设备特有的请求,这些请求不能通过标准的read、write等系统调用来完成。 “ioctl_kb_m”可能指的是键盘(keyboard)和鼠标(mouse)设备的ioctl命令集。在示例...

    ubuntu18.04 在QT下调用V4L2的ioctl函数来实现采集视频流 把采集到的视频流在控件上显示出来 同时采集两个相机

    程序里面使用的是ioctl(ioctl是应用与驱动的常用接口。对字符设备、块设备、及套接字,非常方便扩充新的命令)。 QT版本(qt-opensource-linux-x64-5.13.2)。 使用了QT的线程, 相机的整个采图过程在子线程中进行...

Global site tag (gtag.js) - Google Analytics