一种linux下扩展select模型管理能力的方法

文档序号:9887356阅读:135来源:国知局
一种linux下扩展select模型管理能力的方法
【技术领域】
[0001] 本发明涉及通信领域,尤其涉及一种linux操作系统中扩展select模型的管理能 力的方法。
【背景技术】
[0002] 在软件设计中,如何管理多文件描述符是我们要经常面临的问题,特别是在涉及 基于TCP/IP的网络编程时,需要通过文件描述符对多条通信链路的10进行管理。通常 Linux操作系统提供了 select、poll、epoll等文件描述符管理模型,用户可以方便的使用 各种模型对多文件描述符进行管理。
[0003] 众所周知,在很多软件中都使用了 select模型对文件描述符进行管理,这种模型 能满足文件描述符不大于1023的管理需求。但如果软件的功能发生变更,需要能够管理大 于1023的文件描述符时,我们一般有两种方法:通过重新编译内核调整select管理数量大 小;或者修改文件描述符管理模型。
[0004] 如果重新编译内核,代码平台的通用性将存在风险,必须使用经过重新编译后的 操作系统。如果修改文件描述符管理模型,也会带来一系列的问题:一方面,需要对原有代 码的文件描述符管理框架进行修改,那么复杂的软件系统就需要花费很长时间进行模型改 进,此外新代码还需要重新测试;另一方面,假如在多个模块中都使用了 select模型,通过 poll或者epoll模型对某个模块进行升级时,其它多个功能模块也需要进行代码升级,因 为在同一进程中,select模型是不能与poll或epoll模型共存的,此缺陷是操作系统API 的天然缺陷。

【发明内容】

[0005] 为了解决上述技术问题,本发明提出一种linux操作系统中扩展select模型的管 理能力的方法,该方法可以在不修改原文件描述符管理模型及功能代码,并且不需要对内 核进行重新编译的情况下,通过巧妙的自定义数据结构,简单快速的对select模型的管理 能力进行扩展,使得该模型满足大于l〇23bit文件描述符的管理需求。所述方法为:
[0006] 自定义文件描述符集合数据结构fd_set,该数据结构支持文件描述符集合中的数 据成员大于32个int元素,然后用自定义的fd_set替换系统定义的fd_set ;
[0007] 自定义清零宏,该宏兼容自定义的fd_set,然后用自定义的清零宏替换系统定义 的清零宏。
[0008] 优选的,自定义的fd_set可以具体如下:
[0009]
[0010] 其中,maxfd为需要支持的最大文件描述符。
[0011] 优选的,定义的清零宏可以具体如下:
[0012] #define FD_ZER0 (p) memset (&sampset, 0, sizeof (define_fd_set)) 〇
[0013] 本发明利用select模型对用户空间数据操作的本质,采用自定义数据结构,扩展 了 select模型所需要的读、写、例外集所占用内存的长度的范围,从而达到了扩展文件描 述符数量的目的。本发明具有如下优点:1,能够支持大于1023的文件描述符的管理,快速 满足软件需求;2,不需要修改原代码的文件描述符管理模型,节省了大量的代码重写工作; 3,不需要对内核代码进行重新编译,保证运行平台的通用性;4,完整的兼容linux32位与 linux64 位。
【附图说明】
[0014] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发 明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根 据这些附图获得其他的附图。
[0015] 图1是Linux系统定义的fd_set的结构图;
[0016] 图2是本发明实施例定义的fd_set的结构图;
[0017] 图3是本发明实施例的UDP链路的网络架构图。
【具体实施方式】
[0018] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例 中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是 本发明一部分实施例,而不是全部的实施例;需要说明的是,在不冲突的情况下,本申请中 的实施例及实施例中的特征可以相互组合。基于本发明中的实施例,本领域普通技术人员 在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0019] 实施例:在Linux系统中通过select模型管理2000路一对一的UDP链路
[0020] 本实施例中,select模型要管理大于1023的文件描述符,需要首先对相关的数据 结构进行改造。
[0021] 通过分析linux操作系统源码可以得知,select模型需要5个参数:nfds、 readfds、writefds、exceptfds、timeout,内核根据第一个参数确定集合的内存长度、根据 第二、三、四个参数的地址来确定需要管理的集合的起始地址。具体的文件描述符的数量是 由第一个参数nfds决定的,nfds为最大文件描述符maxfd加1,只要扩展了 nfds的范围, 就可以扩展select的管理能力,保证其功能的兼容性。例如假设nfds为1024,则内存长度 为1024bit,假如将nfds扩展为大于1024的数值,则内存长度大于1024bit,就可以为我们 管理大于1023的文件描述符的10事件。也就是说要扩展select模型的管理能力,关键是 扩展maxfd的范围,而maxfd范围受到的是文件描述符集合数据结构fd_set的限制。
[0022] Linux系统定义的fd_set的结构图如图1所示,fd_set为32个int元素的数组, 一共1024个bit,分别对应1024个文件描述符。Select轮询集合时,如果某个文件描述符 有读、写、例外事件,则把对应的集合中的bit位置1,否则置0。Se 1 ect返回后用户使用FD_ ISSET依次判断所有的文件描述符,如果相应集合中对应的bit位被置为1,则表示该文件 描述符有事件触发。
[0023] 为了扩展maxfd范围,本实施例自定义数据结构fd_set,其结构图如图2所示,需 要的最大文件描述符数量为2000,则将集合中的数据成员修改为63个int元素,一共2016 个bit,可以支持不大于2016的文件描述符的管理。自定义的数据结构fd_set如下:
[0024]
[0025] 此外,系统中的清零宏FD_ZER0定义如下:
[0026] #define FD_ZER0 (p) memset ((p), 0, sizeof (* (p))),
[0027] 由于与文件描述符没有直接的联系,因此也需要修改该宏的定义,使其兼容自定 义的fd_set,具体为:
[0028] #define FD_ZER0 (p) memset (&sampset, 0, sizeof (define_fd_set)) 〇
[0029] 经过上述改造后,select模型就可以管理大于1023的文件描述符了。本实施例 的UDP链路的网络架构如图3所示,具体管理过程为:
[0030] 1,服务端和客户端创建2000路UDP链路,服务端绑定2000个不同的端口,客户端 连接到服务端的2000个不同的端口。
[0031 ] 2,客户端持续给服务端发送数据。
[0032] 3,服务端定义select读集并往其中添加所创建的文件描述符。
[0033] define_fd_set readSet ;
[0034] memset (&readSet, 0, sizeof (define_fd_set)) ;// 使用 memset 而不是 FD_ZER0 清 空读集
[0035] FD_SET (sockFcUreadSet) ;//添加所有2000个创建的udp链路的文件描述符
[0036] 4,服务端调用select函数轮询读集。
[0037] 5、服务集处理读集事件。
[0038] 本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过 程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序 在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者 光盘等各种可以存储程序代码的介质。
[0039] 最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽 管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然 可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替 换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精 神和范围。
【主权项】
1. Iinux操作系统中扩展select模型的管理能力的方法,所述方法为: 自定义文件描述符集合数据结构fd_set,该数据结构支持文件描述符集合中的数据成 员大于32个int元素,然后用自定义的fd_set替换系统定义的fd_set ; 自定义清零宏,该宏兼容自定义的fd_set,然后用自定义的清零宏替换系统定义的清 零宏。2. 根据权利要求1所述的方法,其特征在于,自定义的fd_set具体如下: #define DEFINE_MAX _FD C ((扣縱知巧2)店。*32 ) typedef struct definefd_set ( 親斑妊'_0駆JC畑顾 int 村s_ bits[DEFlNE MAX FD/32]; 始I泌 int -/ds-bits[DEFIN E_M AX-FD/3 2]; #endif } ttefme_fd_set; 其中,maxfd为需要支持的最大文件描述符。3. 根据权利要求1所述的方法,其特征在于,自定义的清零宏具体如下: Sdefine FD_ZERO (p) memset (fesampset, 0, sizeof (define_fd_set)) 〇
【专利摘要】本发明提出一种linux操作系统中扩展select模型的管理能力的方法,所述方法为:自定义文件描述符集合数据结构fd_set,该数据结构支持文件描述符集合中的数据成员大于32个int元素,然后用自定义的fd_set替换系统定义的fd_set;自定义清零宏,该宏兼容自定义的fd_set,然后用自定义的清零宏替换系统定义的清零宏。本发明能够支持大于1023的文件描述符的管理,并且不需要修改原代码的文件描述符管理模型,也不需要对内核代码进行重新编译。
【IPC分类】G06F9/44
【公开号】CN105653252
【申请号】
【发明人】马黎明, 刘凯
【申请人】北京信威通信技术股份有限公司, 深圳信威通信技术有限公司
【公开日】2016年6月8日
【申请日】2014年11月21日
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1