gududesiling 发表于 2011-05-09 08:56

轮询操作 _FD_SET()函数内部算法是如何实现的

小弟最近在看驱动中有关轮询操作,其中有关于select系统调用,涉及到了几个函数,在网上搜了很久,没有过多的解释,我就是想知道这些函数中的算法是如何实现的,有下面3个函数,希望大侠们能解释一个就行了

在这些函数之前,我查找到了一些宏定义:

#define __FDSET_LONGS   (__FD_SETSIZE/__NFDBITS)
#define __FD_SETSIZE    1024
#define __NFDBITS       (8 * sizeof(unsigned long)
typedef struct {
      unsigned long fds_bits ;
} __kernel_fd_set;

typedef __kernel_fd_set         fd_set;




FD_SET(int fd,fd_set *set);//将一个文件描述符加入文件描述集中 。
即将fd在文件描述符中所对应的位置1,*set为所操作的文件描述符集对象。
2static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp)
53{
54      unsigned long __tmp = __fd / __NFDBITS;
55      unsigned long __rem = __fd % __NFDBITS;
56      __fdsetp->fds_bits |= (1UL<<__rem);//将无符号长整型的1左移_rem位
57}

问题就在这,这个里面是如何实现相应的描述符值1的,为啥要进行求商和求余的操作,感觉这些算法估计会在面试的时候进行考核。。。。。
只用解释上面这个函数中的算法即可,我认为下面的和上面的原理一样
#undef __FD_CLR
static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp)
{
    unsigned long _tmp = fd / __NFDBITS;
    unsigned long _rem = fd % __NFDBITS;
    fdsetp->fds_bits &= ~(1UL<<_rem);
}

#undef __FD_ISSET
static __inline__ int __FD_ISSET(unsigned long fd, const __kernel_fd_set *p)
{
    unsigned long _tmp = fd / __NFDBITS;
    unsigned long _rem = fd % __NFDBITS;
    return (p->fds_bits & (1UL<<_rem)) != 0
}
页: [1]
查看完整版本: 轮询操作 _FD_SET()函数内部算法是如何实现的