select函数的调用原理

select函数的调用原理

ID:41562653

大小:59.91 KB

页数:7页

时间:2019-08-27

select函数的调用原理_第1页
select函数的调用原理_第2页
select函数的调用原理_第3页
select函数的调用原理_第4页
select函数的调用原理_第5页
资源描述:

《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,即当前线程,这对唤醒线程非常关键(我们会在下面说明),②笫二个关键点

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。