您的位置:首页 > 其它

fd_set

2015-10-26 17:07 253 查看
select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: