`
adrift
  • 浏览: 19145 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

linux系统下select和poll的实现机理

 
阅读更多
1.用户层应用程序调用select()
2.核心层调用sys_select() ------> do_select()
最终调用文件描述符fd对应的struct file类型变量的struct file_operations *f_op的poll函数。
poll指向的函数返回当前可否读写的信息。
1)如果当前可读写,返回读写信息。
2)如果当前不可读写,则阻塞进程,并等待驱动程序唤醒,重新调用poll函数,或超时返回。
核心层的相关函数(select.c):
do_select( ... )
{
poll_table *wait;
...
for (;;)
{
  set_current_state(TASK_INTERRUPTIBLE);
  for (i = 0 ; i < n; i++)
  {
   unsigned long mask;
   struct file *file;
   ...
   file = fget(i);
   mask = POLLNVAL;
   mask = file->f_op->poll(file, wait);
   if ((mask & POLLIN_SET) && ISSET(bit, __IN(fds,off)))
    retval++;
   if ((mask & POLLOUT_SET) && ISSET(bit, __OUT(fds,off))) {
    retval++;
  }

  if (retval || !__timeout || signal_pending(current))
   break;
  __timeout = schedule_timeout(__timeout); // 此处阻塞,等待驱动wake_up_interruptible
}
current->state = TASK_RUNNING;
}
3.驱动需要实现poll函数。
当驱动发现有数据可以读写时,通知核心层,核心层重新调用poll指向的函数查询信息。
例如:
static unsigned int test_poll(struct file *file, poll_table * wait)
{
poll_wait(file, &queue, wait); // 此处将当前进程加入到等待队列中,但并不阻塞
return POLLIN |POLLRDNORM |...;
}
static void test_...(...)
{
wake_up_interruptible(&queue->proc_list);
}
static void test_init(...)
{
init_waitqueue_head(&queue->proc_list);
}
分享到:
评论

相关推荐

    linux下select和poll的用法

    Linux 下 select 和 poll 的用法 在 Linux 中,select 和 poll 是两个常用的系统调用,它们用于查询设备是否可读写或是否处于某种状态。下面将详细介绍 select 和 poll 的用法。 select 函数 select 函数的作用是...

    linux下select 和 poll的用法

    linux下select 和 poll的用法 linux下select 和 poll的用法 linux下select 和 poll的用法 linux下select 和 poll的用法

    linux内核select/poll,epoll实现与区别

    下面文章在这段时间内研究 select/poll/epoll的内核实现的一点心得体会: select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll...

    EPOLL-linux下select-poll的增强版

    【EPOLL - Linux 下的 Select 和 Poll 增强版】 EPOLL 是 Linux 内核提供的 I/O 多路复用技术,它是 Select 和 Poll 的更高效版本,特别是在处理大量并发连接时。EPOLL 提供了一种基于事件的异步 I/O 模型,能够...

    linux中 epoll poll 和select的区别

    linux中 epoll poll 和select的区别

    linux网络编程中Select和poll服务程序

    在Linux网络编程中,`...总之,`select`和`poll`是Linux网络编程中处理并发I/O的重要工具,它们允许服务器同时处理多个客户端连接,提高了系统的效率和可扩展性。在具体项目中,根据实际情况选择适合的机制至关重要。

    Linux网络编程,包括tcp/upd,select/poll/epoll/pdf

    其中select/poll/epoll都是常用的多路复用技术,它们可以同时监视多个文件描述符,实现高效的I/O复用。 总之,Linux网络编程是一项重要的技能,它涉及到网络通信的基本原理以及多路复用技术的使用,对于开发网络...

    UNIX下SELECT和POLL模型的服务器程序设计论文_EN

    ### UNIX下SELECT和POLL模型的服务器程序设计论文解析 #### 概述 本文档是对一篇关于UNIX环境下SELECT和POLL模型在服务器程序设计中的应用的论文进行的深入解析。SELECT和POLL都是用于实现多路复用的技术,能够...

    linux系统下实现聊天室

    在Linux系统下构建一个聊天室是一项涉及网络编程和多线程技术的任务。下面将详细讲解这个过程中的关键知识点。 首先,我们需要了解TCP协议。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议...

    谈谈select&poll&epoll.docx

    在Linux系统中,当面临需要同时管理大量网络连接或文件描述符时,`select`、`poll`和`epoll`是三种常见的I/O多路复用技术,它们允许程序在一个单独的线程中等待多个文件描述符的事件,提高了程序的效率和并发能力。...

    linux下socket编程之以select方式实现并发服务器

    综上所述,`select`方式的并发服务器模型在Linux下的Socket编程中具有重要的应用价值,它允许服务器高效地处理多个并发连接,是构建网络服务的基础之一。通过分析`tcpserver.c`和`tcpclient.c`的源代码,我们可以...

    linux下用select并发服务器

    总结来说,`select`在Linux下是一种基础的并发服务器实现方式,它允许我们同时处理多个客户端的连接请求和数据传输。尽管对于大规模并发场景存在效率问题,但在小规模应用中,`select`仍然是一个实用且可靠的工具。...

    基于linux的GPIO子系统,使用poll函数监听IO口实时电平变化

    基于Linux开发板的GPIO子系统,使用poll()函数监听io口的实时电平变化,使用示例: GpioApi ioTest = new GpioApi(this); ioTest-&gt;addOutIO(GpioApi::IO_C_0);//添加输出口 ioTest-&gt;addInIO(GpioApi::IO_G_11);//...

    Select函数实现原理分析

    在Linux系统中,`select`函数的实现与底层驱动程序紧密相关。驱动程序需要实现特定的接口——`fops`结构体中的`poll`函数。当`select`函数调用时,会遍历各个文件描述符,并调用对应的`poll`函数来获取文件描述符的...

    linux下视频会议系统实现的完整代码

    综上所述,"Linux下视频会议系统实现的完整代码"涵盖了从底层操作系统到上层应用的多种技术,对于开发者来说,不仅需要深入理解各种技术,还需要具备良好的编程习惯和系统优化能力。通过分析和学习这份源码,不仅...

    linux C++ poll技术源码客户端及服务端实现

    通过实践这些源码,你可以更深入地理解`poll`的使用场景和实现细节,这对于提升在Linux环境下编写高性能网络应用程序的能力大有裨益。记得在实际运行源码时,确保具备必要的运行环境,如正确配置的编译器、合适的...

    linux内核poll源码剖析

    在本文中,我们将深入剖析 Linux 内核中的 poll 源码,了解 poll 系统调用的实现机制。 sys_poll 函数是 poll 系统调用的入口函数,它的原型为: ```c asmlinkage long sys_poll(struct pollfd __user * ufds, ...

    select poll epoll 代码实例

    select poll epoll 代码实例

    高性能网络设计-网络编程(网络io与select、poll、epoll,react).zip

    高性能网络设计-网络编程(网络io与select、poll、epoll,reactor原理与实现、http服务器实现、websocket协议与服务器实现)与网络原理(服务器百万并发,网络协议栈,UDP可靠传输协议QUIC),协程框架NtyCo的实现....

Global site tag (gtag.js) - Google Analytics