libevent - select NFDBITS fd_mask 计算

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

计算下  需要多少个y长度

y==32   需要多少个 int

y==8     需要多少个char


fd = 0~1023

用位数组保存,那么一个int 可以存32个fd,  1024(32*32)个fd  只要32个int 就可以存完了

也就相当于 32*sizeof(int) = 32*4 = 128 个char 啦    malloc(p, 128);     够啦:)


那么要保存2048个值 需要多大的位数组呢?   howmany(2048,  32) * sizeof(int)


fd_set 不够大怎么办?

c语言结构体我人为的元素末尾扩充

fd_set* event_readset_in = malloc(sizeof(fd_set)); 本来这就够了啦

因为原始的可能不够大

所以 我根据 fd 最大值 动态的扩充这个 fd_set

fd 为 1023,  0~1023, 嗯我其实要保存1024个,于是

howmany(maxfd+1, 32)*sizeof(int)    就是至少要分配的数量

那么操作系统用int来保存的么? 我不知道    但是有  NFDBITS 和 fd_mask

libevent的作者看了 linux 等的源代码。得出如下计算公式,fd_mask 你看 mask都有了,它应该和元素尺寸一样大

如果 fd_mask 是 int , 那么NFDBITS就应该是 sizeof(int)*8    

event_readset_in =  realloc(event_readset_in,  howmany(maxfd+1, NFDBITS)*sizeof( fd_mask)   )


我觉得应该确保这个等式成立    NFDBITS == sizeof(fd_mask)*8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值