现在的位置: 首页 > 综合 > 正文

fd_set具体是怎样实现的

2013年12月11日 ⁄ 综合 ⁄ 共 974字 ⁄ 字号 评论关闭

fd_set具体是怎样实现的

 

这是把fd_set相关的源代码汇总在一起。这样应该知道fd_set的实现详细原理

define FD_SETSIZE      1024
typedef unsigned long   fd_mask;

#define NBBY    8               /* number of bits in a byte */
#define NFDBITS (sizeof(fd_mask) * NBBY)        /* bits per mask */

#define howmany(x, y)   (((x) + ((y) - 1)) / (y))

typedef struct fd_set {
        fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];
} fd_set;

 

//typedef struct fd_set {
//    unsigned long  fds_bits[32];
//} fd_set;

 

#define _fdset_mask(n)  ((fd_mask)1 << ((n) % NFDBITS))
#define FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= _fdset_mask(n))
#define FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~_fdset_mask(n))
#define FD_ISSET(n, p)  ((p)->fds_bits[(n)/NFDBITS] & _fdset_mask(n))
#define FD_COPY(f, t)   bcopy(f, t, sizeof(*(f)))
#define FD_ZERO(p)      bzero(p, sizeof(*(p)))

fd_set master_set_read;

FD_SET(600,master_set_read);

=>  master_set_read->fds_bits[(600)/32] |= (1<<(600%32));

 

每个进程最大打开文件数“ulimit -n”:1024,fd是从0~1023,和进程id即pid是两回事

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/linuxchen/archive/2006/09/06/1137990.aspx

抱歉!评论已关闭.