ioctl函数详细说明(网络)

【通俗易懂】详解 ioctl 函数是如何操控底层的 由于要制定具体是哪一盏LED亮或灭,因此必须要传递数据(比如1表示LED1,2表示LED2等)这边是往内核写数据,因此方向位写01(只写)由于要向内核传递是操作第几盏LED,因此这边可以传递一个无符号整型数据(unsigned int)因此数据传递大小位写(4)给 LED 设备类型取一个类型码,此处随意,可取为 ‘L’,它的 ascii 码为 76,因此设备类型码位写01001100(76)给具体功能取一个功能码,此处随意,可以用 10 表示亮灯功能,用 11 表示灭灯功能,因此功能码位写。 阅读详情

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之外的新的定义。

实例:

程序1:检测接口的 .net_addr,netmask,broad_addr
程序2:检查接口的物理连接是否正常
程序3:更简单一点测试物理连接
程序4:调节音量

***************************程序1****************************************
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>

#include <sys/types.h>


#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

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

static void usage(){
        printf("usage : ipconfig interface \n");
        exit(0);
}

int main(int argc,char **argv)
{
        struct sockaddr_in *addr;
        struct ifreq ifr;
        char *name,*address;
        int sockfd;

        if(argc != 2)
                usage();
        else
                name = argv[1];  内容来自ltesting.net  

        sockfd = socket(AF_INET,SOCK_DGRAM,0);
        strncpy(ifr.ifr_name,name,IFNAMSIZ-1);

        if(ioctl(sockfd,SIOCGIFADDR,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&(ifr.ifr_addr);
        address = inet_ntoa(addr->sin_addr);
        printf("inet addr: %s ",address);

        if(ioctl(sockfd,SIOCGIFBRDADDR,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&ifr.ifr_broadaddr; 
        address = inet_ntoa(addr->sin_addr);
        printf("broad addr: %s ",address);

        if(ioctl(sockfd,SIOCGIFNETMASK,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&ifr.ifr_addr;
        address = inet_ntoa(addr->sin_addr);
        printf("inet mask: %s ",address);

        printf("\n");
        exit(0);
}

******************************** 程序2*****************************************************
#include <stdio.h>
#include <string.h>
#include <errno.h> 
#include <fcntl.h>
#include <getopt.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <stdlib.h>
#include <unistd.h>

typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned char u8;

#include <linux/ethtool.h>
#include <linux/sockios.h>

int detect_mii(int skfd, char *ifname)
{
        struct ifreq ifr;
        u16 *data, mii_val;
        unsigned phy_id;

        /* Get the vitals from the interface. */
        strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
        if (ioctl(skfd, SIOCG MI IPHY, &ifr) < 0) 
        {
                fprintf(stderr, "SIOCGMIIPHY on %s failed: %s\n", ifname,
                strerror(errno));
                (void) close(skfd);
                return 2;
        }

        data = (u16 *)(&ifr.ifr_data);
        phy_id = data[0];
        data[1] = 1;


        if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0)
        {
                fprintf(stderr, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name,  领测软件测试网http://www.ltesting.net  
                strerror(errno));
                return 2;
        }

        mii_val = data[3];

        return(((mii_val & 0x0016) == 0x0004) ? 0 : 1);
}

int detect_ethtool(int skfd, char *ifname)
{
        struct ifreq ifr;
        struct ethtool_value edata;

        memset(&ifr, 0, sizeof(ifr));
        edata.cmd = ETHTOOL_GLINK;

        strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)-1);
        ifr.ifr_data = (char *) &edata;

        if (ioctl(skfd, SIOCETHTOOL, &ifr) == -1) 
        {
                printf("ETHTOOL_GLINK failed: %s\n", strerror(errno));
                return 2;
        }

        return (edata.data ? 0 : 1);
}

int main(int argc, char **argv)
{
        int skfd = -1;
        char *ifname;
        int retval;

        if( argv[1] )
                ifname = argv[1];
        else
                ifname = "eth0"; 

        /* Open a socket. */
        if (( skfd = socket( AF_INET, SOCK_DGRAM, 0 ) ) < 0 )
        {
                printf("socket error\n");
                exit(-1);
        }

        retval = detect_ethtool(skfd, ifname);

        if (retval == 2)
                retval = detect_mii(skfd, ifname);


        close(skfd);

        if (retval == 2)
                printf("Could not determine status\n"); 

        if (retval == 1)
                printf("Link down\n");

        if (retval == 0)
                printf("Link up\n");

        return retval;
}

*******************************程序3*****************************************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <net/if.h>
#include <linux/sockios.h>
#include <sys/ioctl.h>
#define LINKTEST_GLINK 0x0000000a

struct linktest_value {
        unsigned int    cmd;
        unsigned int    data; 
};

static
void
usage(const char * pname)
{
        fprintf(stderr, "usage: %s <device>\n", pname);
        fprintf(stderr, "returns: \n");
        fprintf(stderr, "\t 0: link detected\n");
        fprintf(stderr, "\t%d: %s\n", ENODEV, strerror(ENODEV));
        fprintf(stderr, "\t%d: %s\n", ENONET, strerror(ENONET));
        fprintf(stderr, "\t%d: %s\n", EOPNOTSUPP, strerror(EOPNOTSUPP));
        exit(EXIT_FAILURE);
}

static
int
linktest(const char * devname)
{
        struct ifreq ifr;
        struct linktest_value edata;
        int fd; 

        /* setup our control structures. */
        memset(&ifr, 0, sizeof(ifr));
        strcpy(ifr.ifr_name, devname);

        /* open control socket. */
        fd=socket(AF_INET, SOCK_DGRAM, 0);
        if(fd < 0 ) {
                return -ECOMM;
        }

        errno=0;
        edata.cmd = LINKTEST_GLINK;
        ifr.ifr_data = (caddr_t)&edata;

        if(!ioctl(fd, SIOCETHTOOL, &ifr)) {
                if(edata.data) {  ltesting.net  
                        fprintf(stdout, "link detected on %s\n", devname);
                        return 0;
                } else {
                        errno=ENONET;
                }
        }

        perror("linktest");
        return errno;
}

int
main(int argc, char *argv[])
{
        if(argc != 2) { 
                usage(argv[0]);
        }
        return linktest(argv[1]);
}

*************************************程序4*********************************************************
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

#define  BASE_VALUE 257

int main(int argc,char *argv[])
{
        int mixer_fd=0;
        char *names[SOUND_MIXER_NRDEVICES]=SOUND_DEVICE_LABELS;
        int value,i;

        printf("\nusage:%s dev_no.[0..24] value[0..100]\n\n",argv[0]); 
        printf("eg. %s 0 100\n",argv[0]);
        printf("    will change the volume to MAX volume.\n\n");
        printf("The dev_no. are as below:\n");
        for (i=0;i<SOUND_MIXER_NRDEVICES;i++){
                if (i%3==0) printf("\n");
                printf("%s:%d\t\t",names[i],i);
        }
        printf("\n\n");

        if (argc<3)
                exit(1);

        if ((mixer_fd = open("/dev/mixer",O_RDWR))){ 
                printf("Mixer opened successfully,working...\n");
                value=BASE_VALUE*atoi(argv[2]);

                if (ioctl(mixer_fd,MIXER_WRITE(atoi(argv[1])),&value)==0)
                printf("successfully.....");
                else    printf("unsuccessfully.....");
                printf("done.\n");
         }else
                printf("can't open /dev/mixer error....\n");  ltesting.net  

        exit(0);
}


SIOCGMIIPHY 和 SIOCSMIIREG 命令 使用ioctl命令时,可以看到上述两个命令的存在, 在头文件 include/linux/sockios.h,定义如下: #define SIOCETHTOOL 0x8946 /* Ethtool interface */ ethtool 接口#define SIOCGMIIPHY 0x8947 /* Get address of ... 阅读详情

相关推荐

ioctl()函数详解

ioctl()函数详解

qq_33300585的博客 4684

引用 linux ioctl函数

http://vic295.blog.163.com/blog/static/74033530200991974322689/ 引用 linux ioctl函数   2009-10-19 19:43:22|  分类: Linux |  标签: |字号大中小 订阅

WINGCREATE的专栏 2058

从CAD到Web:高效转换STEP/IGES模型为GLB格式的实践指南

本文详细介绍了如何将工业设计中的STEP/IGES模型高效转换为Web友好的GLB格式。通过PythonOCC和gltf-pipeline等工具链,实现从CAD到Web的无缝转换,大幅提升模型加载速度和展示效果。文章包含实战案例、优化技巧和常见问题解决方案,帮助开发者快速掌握3D模型转换技术。

weixin_29072299的博客 507

linux 内核 - ioctl 函数详解

1. 概念 ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。 在文件 I/O 中,ioctl 扮演着重要角色,本文将以驱动开发为侧重点,从用户空间到内核空间纵向分析 ioctl 函数。 2. 用户空间 ioctl #include &...

岁月斑驳7的博客 18万+

从零开始搭建属于自己的语音识别API服务器(ASRT开源项目)

材料准备 云服务器 (本人使用的的是阿里云服务器 Ubuntu(Linux操作系统)) 环境搭建 1. Python 3.7 话不多说直接上代码 sudo su yum -y install git yum -y install gcc yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-deve

zhi_qian的博客 5647

LIN总线从入门到精通:低成本汽车通信协议原理与实战

在汽车电子和嵌入式系统中,串行通信协议是实现分布式控制的关键技术。其中,LIN(Local Interconnect Network)总线作为一种专为低成本应用设计的单主多从网络协议,其核心原理在于通过简化的“领导-汇报”通信模式,在满足车身控制、传感器数据采集等场景需求的同时,将硬件与布线成本降至最低。LIN总线采用标准化的帧结构,包含间隔场、同步场和受保护标识符场,并依赖调度表来管理通信时序,确保了网络的确定性与可靠性。其技术价值在于为车窗、座椅、灯光等非安全关键系统提供了高性价比的解决方案,是构建分层

weixin_29185167的博客 260

unix网络编程——ioctl 函数的用法详解

1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的信息,所以,我们有必要了解一下ioctl函数的具体实现. 2.函数说明 SYNOPSIS        #include        int ioctl(int d, int req

1万+

AI测试实战:用文心一言5分钟生成登录功能测试用例(附Excel模板)

本文详细介绍了如何利用AI工具(如文心一言)在5分钟内高效生成登录功能测试用例,并提供了可直接应用的Excel模板。通过对比传统手工编写与AI生成的效率差异,展示了AI在软件测试领域的巨大优势,包括减少重复劳动、避免边界条件遗漏和提升格式标准化。文章还包含实战技巧、高级应用方案和行业最佳实践,助力测试人员快速提升工作效率。

weixin_30379531的博客 410

《网络编程》ioctl 操作

ioctl 函数和 fcntl 函数类似,都可用于对描述符的操作,获取或设置已打开描述符的属性,但是两个函数在网络编程相关中操作针对不同了类型,fcntl 函数有套接字操作、文件操作,而 ioctl 函数除了可以操作 fcntl 函数可操作的类型之外,还可以进行接口操作、路由表操作、 ARP 高速缓存操作以及流系统操作。

关注校招求职,微信号:job_campus 1967

UE4初学笔记_02_编辑器界面

不同版本可能不一样,这里是4.25 UE4编辑器主界面(也称为关卡编辑器)主要用于构建世界场景和关卡以及放置资源。 1.菜单栏 2.关卡编辑器(Level Editor)工具栏 3.“模式”(Modes)面板 4.“内容浏览器”(Content Browser)面板 5.“视口”(Viewport)面板 6.“世界大纲视图”(World Outliner)面板 7.“细节”(Details)面板 1.菜单栏 菜单栏包含“文件”(File) 、“编辑”(Edit) 、“窗口”(Win.

来自火星的猫 3092

完整复现YOLOv8:包括训练、测试、评估、预测阶段【本文源码已开源,地址在文章末尾】

(这里主要是在colab.research.google.com实现的,本地的配置也是类似的方法)YOLOv8是一种用于目标检测的深度学习算法。主要参考:https://github.com/ultralytics/ultralytics/blob/main/README.zh-CN.md。yolov8的权重:https://github.com/ultralytics/assets/releases。yolov8的文档:https://v8docs.ultralytics.com/

源代码杀手的博客 1万+

linux下ioctl()函数使用的详细说明

原文地址:http://blog.sina.com.cn/s/blog_510c0ebe0100seee.html 相关文章 1、(笔记)Linux下的ioctl()函数详解----http://www.cnblogs.com/tdyizhen1314/p/4896689.html 2、Linux下利用ioctl函数获取网卡信息-----http://blog.youkuaiyun.com/as

xqhrs232的专栏 815

【LAMMPS学习】五、LAMMPS命令(1) LAMMPS 输入脚本

本部分描述了 LAMMPS 输入脚本的格式以及其中的命令如何用于定义 LAMMPS 模拟。主要包括以下内容。

荷塘阅色 2644

Linux 网络编程之ioctl函数

1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的信息,所以,我们有必要了解一下ioctl函数的具体实现. 2.相关结构体与相关函数 #include <sys/ioctl.h> int ioctl(int d,int reque...

weixin_30733003的博客 163

Python爬虫实战:使用最新技术爬取GitHub Trending项目

本文将详细介绍如何使用Python最新技术栈构建一个高效的GitHub Trending爬虫。我们将使用异步请求库httpx、HTML解析库parsel、数据存储方案以及反反爬技术,完整实现一个能够稳定获取GitHub Trending数据的爬虫系统。文章包含5000余字详细教程,从环境搭建到代码实现,再到数据处理和存储,最后部署运行,提供全方位指导。GitHub Trending页面展示了GitHub上当前最受欢迎的项目,对于开发者了解技术趋势、发现优秀项目非常有价值。

2201_76125261的博客 735

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ioctl函数详细说明

ioctl 函数   本函数影响由fd 参数引用的一个打开的文件。   #include int ioctl( int fd, int request, .../* void *arg */ ); 返回0 :成功    -1 :出错   第三个参数总是一个指针,但

Walker(QQ:343675038) 472

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Linux】【驱动】ioctl介绍和应用场景

ioctl 网络设备接口 套接字

vickytong1018的博客 2010

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

linux 下的ioctl简介

这几天有时间看了一下《深入理解linux网络系统内幕》,有关于ioctl部分和大家分享一下。 ioctl说白了就是用户通过调用ioctl函数可以修改驱动相关的东西,函数原型如下: int ioctl(int handle, int cmd,[int *argdx, int argcx]); 如我们使用ifconfig eth0 mtu 1250 这样的命令,用来改变接口eth0的MTU是,...

七七的博客 1766

ioctl 函数

ioctl 函数   本函数影响由fd 参数引用的一个打开的文件。   #include int ioctl( int fd, int request, .../* void *arg */ ); 返回0 :成功    -1 :出错   第三个参数总是一个指针,但

452
上一篇: top命令说明
下一篇: make menuconfig/.config/Kconfig解析
evenness
博客等级 码龄15年 99粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值