资源描述:
《select函数的调用原理》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、在file-operations的函数指针屮,我们常见的一个函数指针poll,poll函数的主要用于多路10复用,主要是让上层应用程序通过select函数可以同时监听多个文件句柄。那么内核是怎样设置poll函数让上层可以同时监听多路10的呢?我们先看系统调用select的定义:/*定义在/fs/select.c*/SYSCALL_DEFINE5(select,int,n,fd_set—user*,inp,fd_set—user*,outp,fd_set—user笃exp,structtimeval—user貧tvp)ret=core_sys_select(n,inp,outp,exp,to)
2、;/*定义在/fs/select.c*/intcore_sys_select(intn,fd_set_user*inp,fd_set_user*outp,fd_set—user*exp,structtimespec*end_time)ret=do_select(n,&fds,end_time);/*do_select函数定义的结构体的关系图*/structpoll_wqueues{poll_tablept:structpoll_table_page*table;structtask_struct*pollmg_task:inttriggered:interror:intinlineindex
3、:structpoll_table_entnrinline_entriesp^_INLINE_POLL_ENTRIES]:};typedefstructpoll_table_struct{poll_queue_procqproc;unsignedlongkey:}poll_table;structpoll_table_entr>r{structfile*filpiunsignedlongkey:wait_queue_twait;wait_queue_head_t*wait_address:};/*定义在/fs/select.c*/#do_selectintdo_select(intn,fd_
4、set_bitsstructtimespec*end_time)structpoll_wqueuestable;poll_table*wait;poll_initwait(&table);wait=&table.pt;for(;;){for(j=0;j<_NFDBITS;++j,++i,bit«=1){file=fget_light(i,&fput_needed);if(file){Lop=file->fLop;mask=DEFAULT_POLLMASK;if(f_op&&f_op->poll){wait_key_set(wait,in,out,bit);mask=(*fLop->poll)
5、(file,wait);fput_light(file,fput_needed);if((mask&POLLIN_SET)&&(in&bit)){res_in
6、=bit;retval++;wait=NULL;}if((mask&POLLOUT_SET)&&(out&bit)){res_out
7、=bit;retval++;wait=NULL;}if((mask&POLLEX_SET)&&(ex&bit)){res_ex
8、=bit;relval++;wait=NULL;讦(retval
9、
10、timed_out
11、
12、signal_pending(current))break;if(!poll_sche
13、dule_timeout(&table,TASK_INTERRUPTIBLE,to,slack))timedout=1:下面我们一步对这函数进行解释,do_select函数首先定义了poll_wqueues类型的结构体局部变量,并且用poll_initwait对poll_wqueues进行初始化。我们看看poll_initwait的定义:/*定义在/fs/select.c*/voidpoll_initwait(structpoll_wqueues*pvq){init_poll_funcptr(&pwq->pt,—pollwait);pwq->polling_task=current;pwq
14、・>triggered=0;pwq・>error=0;pwq->table=NULL;pwq->inline_index=0;}EXPORT_SYMBOL(po也initwait);这里有两点很关键,①第一点是pwq->polling_task=current,就是把poll_wqueues的sttask_struct指针指向current,即当前线程,这对唤醒线程非常关键(我们会在下面说明),②笫二个关键点