千家信息网

I/O多路转接之select

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,I/O多路转接之select(只负责等)系统提供select函数来实现多路复用输入/输出模型。传向select的参数告诉内核:1)我们所关心的文件描述符。参数nfds是需要监视的最大的文件描述符值+1
千家信息网最后更新 2025年01月20日I/O多路转接之select

I/O多路转接之select(只负责等

系统提供select函数来实现多路复用输入/输出模型。

传向select的参数告诉内核:

1)我们所关心的文件描述符。

参数nfds是需要监视的最大的文件描述符值+1;

2)对每个描述符,我们所关心的状态。

rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合。

监视的文件描述符分为三类set,每一种对应等待不同的事件。readfds中列出的文件描述符被监视是否有数据可供读取(如果读取操作完成则不会 阻 塞)。writefds中列出的文件描述符则被监视是否写入操作完成而不阻塞后,exceptfds中列出的文件描述符则被监视是否发生异常,或者无 法控制的数据是否可用(这些状态仅仅应用于套接字)。这三类set可以是NULL,这种情况下select()不监视这一类事件。


下面的宏提供了处理这三种描述词组的方式:

FD_ZERO移除指定set中的所有文件描述符。每一次调用select()之前都应该先调用它;

FD_CLR则从指定的set中移除一个文件描述符;

FD_SET添加一个文件描述符到指定的set中;

FD_ISSET测试一个文件描述符是否指定set的一部分。如果文件描述符在set中则返回一个非0整数,不在则返0,FD_ISSET在调用select() 返回之后使用,测试指定的文件描述符是否准备好相关动作。

3)我们要等待多长时间。(我们可以等待无限长的时间,等待固定的一段时间,或者根本就不等待)

timeout参数是一个指向timeval结构体的指针,timeval定义如下:

struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。

从 select函数返回后,内核告诉我们以下信息:

1)已经做好准备的描述符的个数。

2)对于三种条件哪些描述符已经做好准备。(读,写,异常)

执成功则返回件描述词状态已改变的个数;如果返回0代表在描述词状态改变前已超过timeout时间,没有返回;
当有错误发时则返回-1,错误原因存于errno,此时参数readfds,writefds,exceptfds和timeout的值变成不可预测。错误值可能为:EBADF 件描述词为效的或该件已关闭 ,EINTR 此调被信号所中断 EINVAL 参数n 为负值,ENOMEM 核内存不。

#include#include#include#include#include#include#include#includeint fds[64];const fds_nums=sizeof(fds)/sizeof(fds[0]);static int startup(const char* _ip,int _port){    int sock=socket(AF_INET,SOCK_STREAM,0);    if(sock<0)    {        perror("socket");        exit(2);    }    int opt=1;    setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));    struct sockaddr_in local;    local.sin_family=AF_INET;    local.sin_port=htons(_port);    local.sin_addr.s_addr=inet_addr(_ip);    if(bind(sock,(struct sockaddr*)&local, sizeof(local))<0)    {        perror("bind");        exit(3);    }    if(listen(sock,5)<0)    {        perror("listen");            exit(4);    }    return sock;}static void usage(const char* _proc){    printf("Usage:%s[IP] [PORT]\n",_proc);}int main(int argc,char* argv[]){    if(argc!=3)    {        usage(argv[0]);        exit(1);    }    int i=0;    for(i=0;i0)            {                FD_SET(fds[i],&rset);                max_fd=max_fd0)                        {                            printf("get a new client:socket->%s:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));                            int j=0;                            for(j=0;j0)                                {                                    printf("client#  %s\n",buf);                                }                                else if(_s==0)                                {                                printf("client close...\n");                                close(fds[i]);                                }                                else                                {                                    perror("read");                                }                            }                        }                    }                }                break;        }    }return 0;}

select优点:

(1)相较于之前多线程的方法,使用select不用创建线程,更方便

(2)select目前几乎在所有的平台上都支持,其良好跨平台支持也是它的一个优点

select缺点:

(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大

(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大

(3)能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,因为它依赖于文件系统

(4)select()所维护的文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。

(5)由于网络响应时间的延迟使得大量TCP连接处于非活跃状态,但调用select()会对所有socket进行一次线性扫描,这也会有一些开销




文件 监视 时间 参数 状态 内核 开销 事件 函数 数据 结构 错误 准备 多路 很大 最大 个数 优点 数量 系统 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 创建数据库怎么操作 服务器扩容是什么意思 lso软件开发需要学多久 代理数据库分布式架构 自动获取ip地址说明服务器启动 软件开发用哪款笔记本好使 GPS上传数据库设计 手机wps数据库的建立 服务器安全需要哪些硬件 小学生网络安全班级方案设计 农安质量网络技术售后服务 昆山信息化网络技术咨询热线 广东电商软件开发如何收费 为什么选互联网科技专业 数据库查询处理步骤 怎么设置共享流量数据库 山东快搜网络技术有限公司 r如何设置服务器安全设置 孝感淘宝软件开发 最新linux数据库用的是什么 软件开发怎么分工最合理 胶州ios软件开发哪家便宜 医学国外常用的数据库有哪些 斗地主是什么软件开发的 无纸化会议管理服务器软件 内存数据库 持久化数据库 怎么提取软件开发需求 数据库怎样建立永久表表名 安卓远程连接服务器 教之初服务器管理系统破解版
0