#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