Linux内核sys_poll实现原理

来源:互联网 发布:多益网络官方客服电话 编辑:程序博客网 时间:2024/05/14 06:13

poll的功能:
可以监视多个文件描述符,一旦某个文件描述符就绪(一般是读就绪或者写就绪),就能够通知应用程序进行相应的读写操作。
poll核心代码:

for (;;) {   struct poll_list *walk;   for (walk = list; walk != NULL; walk = walk->next) {       struct pollfd * pfd, * pfd_end;       pfd = walk->entries;       pfd_end = pfd + walk->len;       for (; pfd != pfd_end; pfd++) {/** Fish for events. If we found one, record it                          and kill poll_table->_qproc,so we don't needlessly register any other waiters after this. They'll get immediately deregistered when we break out and return.*/           if (do_pollfd(pfd, pt)) {               count++;               pt->_qproc = NULL;           }       }   }   ....../*省去了一些不是很关键的代码*/    if (!poll_schedule_timeout(wait, TASK_INTERRUPTIBLE, to,    slack))        timed_out = 1;}

poll开始执行时,对每一个文件都执行do_pollfd函数。do_pollfd函数会把poll的一个等待节点,加入到对应文件的等待队列上(通过do_pollfd的参数pfd可以找到对应文件的filp描述符,进而得到该文件的等待队列),并返回当前文件是否可供读写信息。如果没有符合要求的文件,则调用poll_schedule_timeout调度别的程序运行。
等到该进程又被调度运行时,要么就是有监视的文件可供读写了(该文件可供读写时,会唤醒在其等待队列上等待的进程,而poll进程在前面已经加入其等待队列了,所以会被唤醒),要么就是时间超时(也有可能被信号唤醒)。此时,需要再遍历一次,统计一下符合要求的文件信息,然后返回。
表述不好,纯当笔记了。Forgive me。

0 0
原创粉丝点击