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

发布于 2022-10-15 07:33:59 字数 1881 浏览 15 评论 0

小弟最近在看驱动中有关轮询操作,其中有关于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
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文