分类: LINUX
2007-01-05 11:04:32
允许进程指示内核等待多个事件中的任一个发生,并仅在一个或多个事件发生或经过某指定的时间后才唤醒进程。
作为一个例子,我们可以调用函数select并通知内核仅在下列情况发生时才返回
集合{1,4,5}中的任何报述字准备好读
集合{2,7}的任何描述字准备好写
集合{1,4}中的任何描述字有异常条件待处理
已经过了10.2秒
通知内核我们对哪些描述字感兴趣(读、写或异常条件)以及等待多长时间。
描述字不受限于套接口:任何描述字(例如文件描述字)都可用select来测试。
select 定义
int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout);
maxfdp1 : 描述字最大值
readset : 读描述字集
writeset : 写描述字集
exceptset : 异常条件的描述字集
timeout : 等待时间
readset, writeset和exceptset
让内核测试读、写和异常条件所需的描述字。
为这三个参数的每一个指定一个或多个描述字值
描述字集,是一个整数数组,每个数中的每一位对应一个描述字。
数组的第一个元素对应于描述字0-31,
数组户的第二个元素对应于描述字32—63。
例子:
fd_set rset; //定义描述字集数据类型
FD_ZERO (&rset); //对描述字集初始化
FD_SET(1, &rset); //打开描述字的第1位
FD_SET(4, &rset) // //打开描述字的第4位
......
FD_ISSET(4, &rest) //测试描述字的第4位
FD_CLR(4, &rset) // //关闭描述字的第4位
readset 套接口准备好读
套接口接收缓冲区中的数据字节数>=
套接口接收缓冲区低潮限度的当前值
连接的读这一半关闭(接收了FIN的TCP连接)
套接口是一个监听套接口旦已完成的连接数为非0。
有一个套接口错误待处理。
writeset 套接口准备好写
套接口发送缓冲区中的可用空间字节数大干等于套接口发送缓冲区低潮限度的
当前值,且或者(i)套接口已连接,或者(i)套接口不要求连接
连接的写这一半关闭。对这样的套接口的写操作将产生信SIGPIPE。
有一个套接口错误待处理。对这样的套接口的写操作将不阻塞且返回一个错误(一1)
exceptset异常条件待处理
如果一个套接口存在带外数据或者仍处于带外标记,那它有异常条件待处理。
带外数据(out—of—band data),有时也称为加速数据(expedited data),
是指连接双方中的一方发生重要事情,想要迅速地通知对方。
这种通知在已经排队等待发送的任何“普通”(有时称为“带内”)数据之前发送。
带外数据设计为比普通数据有更高的优先级。
带外数据是映射到现有的连接中的,而不是在客户机和服务器间再用一个连接。
最大描述字 maxfdp1
当select刚开始设计时,操作系统常对每个进程可用的最大描述字数上限作出
限制(4.2BSD的限制为31),select也就用相同的限制值。
unix版本对每个进程的描述字数根本不作限制 (仅受限于内存量和管理性限制),
#include
#DEFINE FD_SETSIZE 256
chinaunix网友2008-11-04 14:01:27
"C/C++是什么? 想知道就把它彻底吞下去! 去死吧 讨厌的 C/C++!!!!!!!!!!!" 你这是什么话呀,C和C++多好,所有语言的祖宗你都不认得了