LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1210|回复: 1

select中FD_SET(fd, fdsp)的相关代码,有谁指点指点啊

[复制链接]
发表于 2006-10-30 15:27:45 | 显示全部楼层 |阅读模式
最近在unix network programming,看到了select,用fd_set来表示要监视套接字的结合,我觉得fd-set后面一定大有文章,可是当我看到代码以后,我发觉我看不懂,代码倒不是很长。部分代码我找出来了,希望大哥大姐们帮忙看看,让大家进步进步啊,谢谢

  1. #define    FD_SET(fd, fdsetp)      __FD_SET (fd, fdsetp)
  2. ---------------------------------------------------------------------------------------------------
  3. typedef struct
  4. {
  5.         /* XPG4.2 requires this member name.  Otherwise avoid the name from the global namespace.  */
  6.         #ifdef __USE_XOPEN
  7.                 __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
  8.                 # define __FDS_BITS(set) ((set)->fds_bits)
  9.         #else
  10.                 __fd_mask __fds_bits[__FD_SETSIZE / __NFDBITS];
  11.                 //sys/select.h:                    typedef long int __fd_mask;
  12.                 //bits/typesizes.h:                #define __FD_SETSIZE            1024
  13.                 //sys/select.h:                    #define __NFDBITS  (8 * sizeof (__fd_mask))
  14.                 //__fds_bits是1024bits的数组
  15.                 # define __FDS_BITS(set) ((set)->__fds_bits)
  16.                 //返回fd_set结构的数据fd_set->__fds_bits
  17.         #endif
  18. } fd_set;


  19. ---------------------------------------------------------------------------------------------------------
  20. # define __FD_ZERO(fdsp) \
  21.   do {                                                                              \
  22.     int __d0, __d1;                                                              \
  23.     __asm__ __volatile__ ("cld; rep; stosl"                                      \
  24.                           : "=c" (__d0), "=D" (__d1)                              \
  25.                           : "a" (0), "0" (sizeof (fd_set)                      \
  26.                                           / sizeof (__fd_mask)),              \
  27.                             "1" (&__FDS_BITS (fdsp)[0])                              \
  28.                           : "memory");                                              \
  29.   } while (0)

  30. # define __FD_SET(fd, fdsp) \
  31.   __asm__ __volatile__ ("btsl %1,%0"                                              \
  32.                         : "=m" (__FDS_BITS (fdsp)[__FDELT (fd)])              \
  33.                         : "r" (((int) (fd)) % __NFDBITS)                      \
  34.                         : "cc","memory")
  35. # define __FD_CLR(fd, fdsp) \
  36.   __asm__ __volatile__ ("btrl %1,%0"                                              \
  37.                         : "=m" (__FDS_BITS (fdsp)[__FDELT (fd)])              \
  38.                         : "r" (((int) (fd)) % __NFDBITS)                      \
  39.                         : "cc","memory")
  40. # define __FD_ISSET(fd, fdsp) \
  41.   (__extension__                                                              \
  42.    ({register char __result;                                                      \
  43.      __asm__ __volatile__ ("btl %1,%2 ; setcb %b0"                              \
  44.                            : "=q" (__result)                                      \
  45.                            : "r" (((int) (fd)) % __NFDBITS),                      \
  46.                              "m" (__FDS_BITS (fdsp)[__FDELT (fd)])              \
  47.                            : "cc");                                              \
  48.      __result; }))
复制代码
 楼主| 发表于 2006-11-7 17:44:00 | 显示全部楼层
难道没人研究过啊?我记得以前有人提过这个问题的,就是找不到了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表