免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2339 | 回复: 0
打印 上一主题 下一主题

轮询操作 _FD_SET()函数内部算法是如何实现的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-09 08:56 |只看该作者 |倒序浏览
小弟最近在看驱动中有关轮询操作,其中有关于select系统调用,涉及到了几个函数,在网上搜了很久,没有过多的解释,我就是想知道这些函数中的算法是如何实现的,有下面3个函数,希望大侠们能解释一个就行了

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

#define __FDSET_LONGS   (__FD_SETSIZE/__NFDBITS)
#define __FD_SETSIZE    1024
#define __NFDBITS       (8 * sizeof(unsigned long)
typedef struct {
        unsigned long fds_bits [__FDSET_LONGS];
} __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[__tmp] |= (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[_tmp] &= ~(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[_tmp] & (1UL<<_rem)) != 0
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP