fd_set
2015-10-26 17:07
253 查看
select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一socket或文件发生了可读或可写事件。
fd_set set;
FD_ZERO(&set); /*将set清零使集合中不含任何fd*/
FD_SET(fd, &set); /*将fd加入set集合*/
FD_CLR(fd, &set); /*将fd从set集合中清除*/
FD_ISSET(fd, &set); /*在调用select()函数后,用FD_ISSET来检测fd在fdset集合中的状态是否变化返回整型,当检测到fd状态发生变化时返回真,否则,返回假(0)*/
以上式子中的fd为socket句柄。
示例:
结构体原型:编辑 <pre name="code" class="cpp">typedef struct { /*XPG4.2requiresthismembername.Otherwiseavoidthename fromtheglobalnamespace.*/ #ifdef__USE_XOPEN __fd_maskfds_bits[__FD_SETSIZE/__NFDBITS]; #define__FDS_BITS(set)((set)->fds_bits) #else __fd_mask__fds_bits[__FD_SETSIZE/__NFDBITS]; #define__FDS_BITS(set)((set)->__fds_bits) #endif }fd_set;
常见用法:编辑
fd_set set;FD_ZERO(&set); /*将set清零使集合中不含任何fd*/
FD_SET(fd, &set); /*将fd加入set集合*/
FD_CLR(fd, &set); /*将fd从set集合中清除*/
FD_ISSET(fd, &set); /*在调用select()函数后,用FD_ISSET来检测fd在fdset集合中的状态是否变化返回整型,当检测到fd状态发生变化时返回真,否则,返回假(0)*/
以上式子中的fd为socket句柄。
示例:
<span style="color: rgb(128, 128, 128); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; line-height: 13.1875px; white-space: pre;">#include <stdio.h></span>
#include <sys/select.h>
#include <unistd.h> int main(int argc, char **argv){ fd_set fdset; FD_ZERO (&fdset); /*清空集合中所有的元素*/ FD_SET(STDOUT_FILENO,&fdset); /*设置stdout,使集合中包含stdout*/ if(FD_ISSET(STDOUT_FILENO,&fdset)!=0) /*测试stdout是否包含在集合中*/ printf("stdout has been set\n"); else printf("stdout has not been set\n"); FD_CLR(STDOUT_FILENO,&fdset); /*从位向量中清除stdout*/ if(FD_ISSET(STDOUT_FILENO,&fdset)!=0) /*再次测试*/ printf("stdout has been set\n"); else printf("stdout has not been set\n"); return 0; }
相关文章推荐
- PHP如何使用GeoIP数据库
- spring boot 实现本地的log 文件
- CUDAExample-0-cppIntegration
- Faraz Jaka“双线作战”收入10万美元
- coredata和sqlite的区别
- oracle数据库零散知识01
- 第八周项目1-建立顺序串的算法库
- nodejs 安装 使用
- js判断手机端操作系统
- XmlSerializer 序列化与反序列化CDATA 以及实现
- Android里的onTouch事件的分发与消费
- 二维码名片的格式 - vcard
- html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器
- Gradle 多环境、多渠道打包
- SAXRead对xml文件进行读取
- 第六周数据结构实践——括号的匹配(栈)【项目3-括号的匹配】
- Mac OS 更新到10.11之后,CocoaPods插件不能用了
- 基于jquery实现鼠标滚轮驱动的图片切换效果
- Web project和java project ,web service project的区别
- 链路层常见报文格式及长度