没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
linux 下 select 和 poll 的用法
select()函数的作用
系统调用 select 和 poll 的后端实现,用这两个系统调用来查询设备是否可读写,或是否
处于某种状态。如果 poll 为空,则驱动设备会被认为即可读又可写,返回值是一个状态掩
码
如何使用 select()函数?
select()函数的接口主要是建立在一种叫'fd_set'类型的基础上。它('fd_set') 是一组文件描
述符(fd)的集合。由于 fd_set 类型的长度在不同平台上不同,因此应该用一组标准的宏定义
来处理此类变量:
fd_set set;
FD_ZERO(&set); /* 将 set 清零 */
FD_SET(fd, &set); /* 将 fd 加入 set */
FD_CLR(fd, &set); /* 将 fd 从 set 中清除 */
FD_ISSET(fd, &set); /* 如果 fd 在 set 中则真 */
在过去,一个 fd_set 通常只能包含少于等于 32 个文件描述符,因为 fd_set 其实只用了一个
int 的比特矢量来实现,在大多数情况下,检查 fd_set 能包括任意值的文件描述符是系统的
责任,但确定你的 fd_set 到底能放多少有时你应该检查/修改宏 FD_SETSIZE 的值。*这个
值是系统相关的*,同时检查你的系统中的 select() 的 man 手册。有一些系统对多于 1024 个
文件描述符的支持有问题。[译者注: Linux 就是这样的系统!你会发现 sizeof(fd_set)的结
果是 128(*8 = FD_SETSIZE=1024) 尽管很少你会遇到这种情况。]
select 的基本接口十分简单:
int select(int nfds, fd_set *readset, fd_set *writeset,
fd_set *exceptset, struct timeval *timeout);
其中:
nfds
需要检查的文件描述符个数,数值应该比是三组 fd_set 中最大数
更大,而不是实际文件描述符的总数。
readset
用来检查可读性的一组文件描述符。
writeset
用来检查可写性的一组文件描述符。
exceptset
用来检查意外状态的文件描述符。(注:错误并不是意外状态)
timeout
NULL 指针代表无限等待,否则是指向 timeval 结构的指针,代表最
长等待时间。(如果其中 tv_sec 和 tv_usec 都等于 0, 则文件描述符
的状态不被影响,但函数并不挂起)
扛一肩记忆
- 粉丝: 7
- 资源: 45
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页