关于linux下fd_set的理解

        select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄。

    fd_set  set;

    FD_ZERO(&set);        /*将set清零使集合中不含任何fd*/

    FD_SET(fd, &set);      /*将fd加入set集合*/

    FD_CLR(fd, &set);      /*将fd从set集合中清除*/

    FD_ISSET(fd, &set);   /*检查某个fd在函数select调用后,相应位是否仍然为1,因为调用select()后三组fd_set均将某些fd位置0,只有那些可读,可写以及有异常条件待处理的fd位仍然为1*/

        例如:

  FD_ZERO(&set);        /*将set的所有位置0,如set在内存中占8位则将set置为00000000*/

   FD_SET(0, &set);       /*将set的第0位置1,如set原来是00000000,则现在变为100000000,这样fd==1的文件描述字就被加进set中了*/

   FD_CLR(4, &set);       /*将set的第4位置0,如set原来是10001000,则现在变为10000000,这样fd==4的文件描述字就被从set中清除了*/

   FD_ISSET(5, &set);     /*测试set的第5位是否为1,如果原来set是10000100,则返回非零,表明fd==5的文件描述符在set中,否则返回0*/

    nfds: 需要检查的文件描述字个数(即检查到fd_set的第几位),数值应该比三组fd_set中所含的最大fd值更大,一般设为三组fd_set中所含的最大fd值加1(如在readset, writeset, exceptset中所含最大的fd为5,则nfds=6,因为fd是从0开始的 )。设这个值是为了提高效率,使函数不必检查fd_set的所有1024位。

    readset: 用来检查可读性的一组文件描述字。

    writeset: 用来检查可写性的一组文件描述字。

    exceptset: 用来检查是否有异常条件出现的文件描述字。(注:错误不包括在异常条件之内)

    timeout: 有三种可能:

    1.  timeout = NULL (阻塞:直到有一个fd位被置为1函数才返回)

    2.  timeout所指向的结构设为非零时间(等待固定时间:有一个fd位被置为1或者时间耗尽,函数均返回)

    3.  timeout所指向的结构,时间设为0(非阻塞:函数检查完每一个fd后立即返回)

    返回值:返回对应位仍然为1的fd的总数。

    Remark:

    三组fd_set均将某些fd位置0,只有那些可读,可写以及有异常条件待处理的fd位仍然为1。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值