I/O多路复用的解决方法--select

ubuntu12.04

在实际情况中,人们往往遇到多个客户端连接服务器端的情况。由于如connet()、recv()和send() 、accept()等都是阻塞性函数,如果资源没有准备好,则调用该函数的进程将进入睡眠状态,这样就无法处理I/O多路复用的情况了。

使用fcntl()函数虽然可以实现非阻塞I/O或信号驱动I/O,但在实际使用时往往会对资源是否准备完毕进行循环测试,这样就大大增加了不必要的CPU资源的占用。在这里可以使用select()函数来解决这个问题,同时,使用select()函数还可以设置等待的时间,可以说功能更加强大。

所在库:

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

 函数原型:

int select(int n, fd_set *read_fds, fd_set *write_fds, fd_set *except_fds, struct timeval *timeout);

n 最大文件描述符+1

read_fds      读文件描述符集合 (scanf  recv)

write_fds     写文件描述符集合

except_fds  异常文件描述符

timeout        超时设置.

Null:一直阻塞,直到有文件描述符就绪或出错

时间值为0:仅仅检测文件描述符集的状态,然后立即返回

时间值不为0:在指定时间内阻塞,如果没有事件发生,则超时返回。

示例:

#include <sys/time.h>
struct timeval tv;
 /* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;
retval = select(1, &rfds, NULL, NULL, &tv);

返回值为>0 就是有事件发生,有几个文件描述符发生了变化
      =0 超时返回

-1 出错

集合变量类型:fd_set r_fds;

集合变量运算宏:

FD_ZERO(&r_fds )

FD_SET(把某一个FD, 加入监控)

FD_ISSET(FD, fd_set),判断现在文件描述符对应的文件是不是有变化,如果有,返回值为真,无则假

FD_CLR

时间: 2025-01-05 17:16:50

I/O多路复用的解决方法--select的相关文章

eclipse插件Maven添加依赖查询无结果的解决方法(Select Dependency doesn&#39;t work)

在eclipse中用过maven的可能都遇到过这种情况,我以前一直在search.maven里面搜索,然后添加pom信息. 今天在网上搜索时,找到了一个解决方法,在这里分享一下. 第一步,在preferences里面选择maven,选中"Download repository index updates on startup" 第二步,打开Maven仓库 第三步,在全局仓库上右键选择"Full Index Enabled" 选择之后,maven会下载一个近百兆的索引

Mysql 时间格式默认空串 &#39;0000-00-00 00:00:00&#39; select抛出异常的解决方法

Mysql 时间格式默认插入值为空时,会以'0000-00-00 00:00:00'填充,这时如果select时会抛出SQLExecption如下: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp 解决方法如下: 方法一:jdbc的url加zeroDateTimeBehavior参数: datasource.url=jdbc:mysql://localh

火狐浏览器select文字垂直不居中的解决方法

1.问题:火狐浏览器select文字垂直不居中 .zcsearch select{height:24px;} <div class="zcsearch"> <select > <option>全部</option> </select> </div> 2.解决方法:使用padding: 1px 0;即可 .zcsearch select{height:24px;padding: 1px 0;}

win7系统开机遇到reboot and select proper boot device错误解决方法

今天公司一台连接打印机的旧电脑遇到了这样的问题,网络连接显示红叉叉,网线是好的,网络端口到机柜配线架也是通的,交换机端口也是闪烁的,重新启动之后恢复正常了.过几个小时还是同样的问题,检查机箱发现pci接口多接了一个网卡,手贱给拆下来,重启机器报错如下:reboot and select proper boot device or insert boot media in selected boot device and press a key 意思是:重启并选择启动设备或者在启动设备选择插入引导

IE6浏览器下div无法遮盖select下拉框解决方法

IE6浏览器下div无法遮盖select下拉框解决方法:在IE6浏览器下,select下拉框无法被div遮盖,其他的主流浏览器都是正常的.这里简单介绍一下如何解决此问题.默认状态下IE6的表现: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.51texiao.cn

oracle select in超过1000条报错解决方法

本博客介绍oracle select in超过1000条数据的解决方法,java框架是采用mybatis的,这可以说是一种比较常见的错误:select * from A where id in(...),oracle官方函数做了限定,in里的参数只能1000个,所以超过1000个参数就会报错,解决方法是将集合分为每个集合1000的小集合,然后用or拼起来select * from A where id in(1,2,...,1000) or id in (1001,1002,2000)...,好

oracle数据库ORA-01654 错误的解决方法

引言: 数据库突然报: ORA-01654: unable to extend index BO.INDEX_indexname by 311072 in tablespace 错误,上网查原因,发现解决方法只有一个,就 是增加tablespace的大小.现归纳解决此问题的方法如下. 方法1: 当出现类似错误时,首先检查tablespace的空间是否足够大,如果不够大,说明tablespace的空间不够扩展了,这时候需要将tablespace的datafile的 size变大,方法很简单我就不讲

IN 查询时出现ORA-01795:列表中的最大表达式数为1000解决方法

问题描述: SQL进行IN查询时出现:java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000 解决办法: 问题原因是:SQL进行IN查询时,IN中的数据量不能超过1000条. 例如:select * from student where id in ('S1','S2'...........) 如果in后面数据量过多的话就会报错. 解决方法是:用 or关键字 如:select * from student where id in('S1','S2',

【spring boot+mybatis】注解使用方式(无xml配置)设置自动驼峰明明转换(),IDEA中xxDao报错could not autowire的解决方法

最近使用spring boot+mybatis,使用IntelliJ IDEA开发,记录一些问题的解决方法. 1.在使用@Mapper注解方式代替XXmapper.xml配置文件,使用@Select等注解配置sql语句的情况下,如何配置数据库字段名到JavaBean实体类属性命的自动驼峰命名转换? 使用spring boot后,越来越喜欢用注解方式进行配置,代替xml配置文件方式.mybatis中也可以完全使用注解,避免使用xml方式配置mapper.(参考  springboot(六):如何优