zoukankan      html  css  js  c++  java
  • fd_set实现原理

    fd_set是一个结构
    /* The fd_set member is required to be an array of longs.  */
    typedef long int __fd_mask;
      
    /* Some versions of <linux/posix_types.h> define this macros.  */
    #undef  __NFDBITS
    /* It's easier to assume 8-bit bytes than to get CHAR_BIT.  */
    #define __NFDBITS   (8 * (int) sizeof (__fd_mask)) //32
    #define __FD_ELT(d) ((d) / __NFDBITS)
    #define __FD_MASK(d)    ((__fd_mask) 1 << ((d) % __NFDBITS))
      
    /* fd_set for select and pselect.  */
    typedef struct
      {
        /* XPG4.2 requires this member name.  Otherwise avoid the name
           from the global namespace.  */
    #ifdef __USE_XOPEN
        __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];// __FD_SETSIZE=1024 __NFDBITS=32
    # 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;
    
    
    
    

      

    可以看到结构里面有一个fds_bits,大小是32(1024/32)。

    __fd_mask是一个长整形,占4位字节,也就是4*8=32bit,每一个bit都对应一个fd。也就是很多人说的,第一位对应0-31,第二位对应32-63.

    #define __FD_SET(d, set) 
      ((void) (__FDS_BITS (set)[__FD_ELT (d)] |= __FD_MASK (d)))
    #define __FD_CLR(d, set) 
      ((void) (__FDS_BITS (set)[__FD_ELT (d)] &= ~__FD_MASK (d)))
    #define __FD_ISSET(d, set) 
      ((__FDS_BITS (set)[__FD_ELT (d)] & __FD_MASK (d)) != 0)
    
    
    
    

      FD_SET函数,分开看__FDS_BITS (set)结构里面的fds_bits数组。__FD_ETL(d),除32,看这个fd在fd_bits第几位上。

      FD_MASK 这个宏特别的牛逼,确实佩服一下,先模32,然后就得出余数,然后将1向左移位,这样一来就可以进行&,互不影响。

  • 相关阅读:
    Ansible import_playbook 导入playbook
    Ansible Playbook 变量传递
    Ansible Notify与Handler组合
    Ansible Role
    Ansible infile模块
    Ansible When有条件的运行任务
    Ansible register捕获命令输出
    Ansible Command Shell Raw模块区别
    Ansible Facts
    Ansible Jinjia2模块
  • 原文地址:https://www.cnblogs.com/HPhone/p/3662011.html
Copyright © 2011-2022 走看看