中国开发网: 论坛: 程序员情感CBD: 贴子 102271
bjwf
只说我知道的:
事实上select里面是调用的 poll,当写一个需要支持select的设备驱动程序时只用实现poll就行了

select 和 poll 需要的是fd(文件描述符),并不局限于socket的 fd,可以是设备的一个节点,下面这一段是 linux2.4-17中do_select的代码.

int do_select(int n, fd_set_bits *fds, long *timeout)
{
poll_table table, *wait;
int retval, i, off;
long __timeout = *timeout;

read_lock(&current->files->file_lock);
retval = max_select_fd(n, fds);
read_unlock(&current->files->file_lock);

if (retval < 0)
return retval;
n = retval;

poll_initwait(&table);
wait = &table;
if (!__timeout)
wait = NULL;
retval = 0;
for (;;) {
set_current_state(TASK_INTERRUPTIBLE);
for (i = 0 ; i < n; i++) {
unsigned long bit = BIT(i);
unsigned long mask;
struct file *file;

off = i / __NFDBITS;
if (!(bit & BITS(fds, off)))
continue;
file = fget(i);
mask = POLLNVAL;
if (file) {
TRACE_FILE_SYSTEM(TRACE_EV_FILE_SYSTEM_SELECT,
i /* The fd*/,
__timeout,
NULL);
mask = DEFAULT_POLLMASK;
//************************
//add by bjwf
//注意这里是调用的fd所指向的poll
if (file->f_op && file->f_op->poll)
mask = file->f_op->poll(file, wait);
fput(file);
}
if ((mask & POLLIN_SET) && ISSET(bit, __IN(fds,off))) {
SET(bit, __RES_IN(fds,off));
retval++;
wait = NULL;
}
if ((mask & POLLOUT_SET) && ISSET(bit, __OUT(fds,off))) {
SET(bit, __RES_OUT(fds,off));
retval++;
wait = NULL;
}
if ((mask & POLLEX_SET) && ISSET(bit, __EX(fds,off))) {
SET(bit, __RES_EX(fds,off));
retval++;
wait = NULL;
}
}
wait = NULL;
if (retval || !__timeout || signal_pending(current))
break;
if(table.error) {
retval = table.error;
break;
}
__timeout = schedule_timeout(__timeout);
}
current->state = TASK_RUNNING;

poll_freewait(&table);

/*
* Up-to-date the caller timeout.
*/
*timeout = __timeout;
return retval;
}

至于63的说法,看看这个函数
static int max_select_fd(unsigned long n, fd_set_bits *fds)
{
unsigned long *open_fds;
unsigned long set;
int max;

/* handle last in-complete long-word first */
set = ~(~0UL << (n & (__NFDBITS-1)));

//************************
//add by bjwf
//注意这一句:
n /= __NFDBITS;
//在某个头文件里__NFDBITS的定义为:
//#define __NFDBITS (8 * sizeof(unsigned long))


open_fds = current->files->open_fds->fds_bits+n;
max = 0;
if (set) {
set &= BITS(fds, n);
if (set) {
if (!(set & ~*open_fds))
goto get_max;
return -EBADF;
}
}
while (n) {
open_fds--;
n--;
set = BITS(fds, n);
if (!set)
continue;
if (set & ~*open_fds)
return -EBADF;
if (max)
continue;
get_max:
do {
max++;
set >>= 1;
} while (set);
max += n * __NFDBITS;
}

return max;
}
试图在互联网上划出国界的举动是愚蠢的!!!
把人当成猪羊圈养,草料永远都不够!把人当人待,人有无限的创造力! “人口减少一半,人们两倍富有”的观念为“一种非常糟糕的自甘堕落—这背后的潜台词是,似乎中国人是封闭围栏中的动物,对周围那些自己赖以生存的资源,除了咀嚼,别无办法。”

我的像册:http://picasaweb.google.com/bjwf2000/
我的主页: http://bjwf2000.googlepages.com/

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录