Linux 设备驱动--- Poll 方法 --- Select【转】

转自:http://blog.csdn.net/yikai2009/article/details/8653842

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[-]

  1. Select - 系统调用 int select - 功能
    1. 函数
    2. 参数
    3. 返回值
  2. Select - 系统调用- 使用方法
    1. 1将要监控的文件添加到文件描述符集
    2. 2调用 Select 开始监控
    3. 3判断文件是否发生变化
  3. 四个宏对描述符集进行操作 -  FD_SET - FD_CLR - FD_ZERO - FD_ISSET
  4. Poll 方法 - 驱动中 int poll
  5. Poll 设备方法负责完成 - 驱动中
    1. 使用 poll_wait  将等待队列添加到 poll_table 中
    2. 返回描述设备是否 可读 或者 可写 的掩码 - POLLIN
  6. Poll 工作原理

在驱动 ( 内核空间 )  Poll 方法  对应的是 Select 系统调用 ( 用户空间 ).

Poll  ------------------------->   Select

Select - 系统调用 int select - 功能:

Seclect 系统调用用于多路监控,当没有一个文件满足要求时,Select将阻塞调用进程.

函数:

int   select  ( int  maxfd , fd_set *readfds , fd_set  * writefds , fe_set  *exceptfds , const stuct timeval * timeout )  .

参数:

Maxfd : 文件描述符的范围,比待检测的最大文件描述符 大 1 .

Readfds :被读检测的文件描述符集.

Writefds  :被写监控的文件描述符集.

Exceptfds:被异常监控的文件描述符集.

Timeout   :定时器.

Timeout 取不同的值。该调用有不同的表现:

1,Timeout 值为 0,不管是否有文件满足要求,都立刻返回.

无文件满足要求返回 0 ,有文件满足要求返回一个正值.

2,Timeout 为 NULL .Select 将阻塞进程. 直到某个文件满足要求.

3,Timeout 为正整数,就是等待的最长时间,即 Select 在 Timeout 时间内阻塞进程.

返回值:

Select 调用返回时,返回值有如下情况:

1,正常情况下返回满足要求的文件描述符个数.

2,经过了 Timeout 等待后仍无文件满足要求,返回值为 0 .

3,如果 Select 被某个信号中断,它将返回 -1 并 设置 errno 为 EINTR .

4,如果出错,返回 -1 并设置相应的 errno .

Select - 系统调用- 使用方法:

1,将要监控的文件添加到文件描述符集.

2,调用 Select 开始监控.

3,判断文件是否发生变化.

四个宏对描述符集进行操作 -  FD_SET - FD_CLR - FD_ZERO - FD_ISSET :

系统提供了 4 个宏对描述符集 进行操作:

#include  < sys/select.h >

void  FD_SET ( int  fd , fd_set * fdset )      将文件描述符 fd  添加到文件描述集 fdset 中.

void  FD_CLR ( int  fd , fd_set * fdset )     从文件描述符集 fdset  中清除文件描述符 fd .

void  FD_ZERO ( fd_set * fdset )               清空文件描述符集 fdset .

void  FD_ISSET ( int  fd , fd_set * fdset )  在调用 Select 后 使用该宏 来检测文件描述符集 fdset 中文件 fd 发生了变化.

eg:

Poll 方法 - 驱动中 int (*poll) :

应用程序常常使用 Select 系统调用,它可能会阻塞进程.

这个调用由驱动的 Poll 方法来实现,原型为:

unsigned  int  ( *poll ) ( struct  file * filp , poll_table * wait )

Poll 设备方法负责完成 - 驱动中 :

使用 poll_wait  将等待队列添加到 poll_table 中:

1,使用 poll_wait  将等待队列添加到 poll_table 中.

返回描述设备是否 可读 或者 可写 的掩码 - POLLIN :

2, 返回描述设备是否可读或者可写的掩码.

位掩码:

POLLIN   :设备可读.

POLLRDNORM : 数据可读.

POLLOUT  :设备可写.

POLLWRNORM  :数据可写.

                         设备可读通常返回 ( POLLIN  |   POLLRDNORM )

                           设备可写通常返回 ( POLLOUT  |   POLLWRNORM )      

eg:

Poll 工作原理:

Poll 方法只是做一个登记,真正的阻塞发生在 select.c 中的 do_select 函数中.

时间: 2024-08-08 14:39:59

Linux 设备驱动--- Poll 方法 --- Select【转】的相关文章

Linux高级字符设备驱动 poll方法(select多路监控原理与实现)

1.什么是Poll方法,功能是什么? 2.Select系统调用(功能)      Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程.      int select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, const struct timeval *timeout)     Select系统调用(参数)     1)Maxfd:           文件描述符的范围,比

linux设备驱动归纳总结(三):6.poll和sellct【转】

本文转载自:http://blog.chinaunix.net/uid-25014876-id-61749.html linux设备驱动归纳总结(三):6.poll和sellct xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 接下来会讲系统调用select在驱动中的实现,如果对系统调用select不太懂的话,建议先看书补习一下. xxxxxxxxxxxxxxxxxxxx

linux设备驱动归纳总结(三):6.poll和sellct

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 接下来会讲系统调用select在驱动中的实现,如果对系统调用select不太懂的话,建议先看书补习一下. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 一.系统调用select的简介 简单来说,se

linux设备驱动第四篇:驱动调试方法

linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法 http://v.17173.com/playlist_18716517.htmlhttp://v.17173.com/playlist_18716521.

linux设备驱动第四篇:从如何定位oops的代码行谈驱动调试方法

上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试.在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序,那么驱动程序如何调试呢?我们知道在调试程序时经常遇到的问题就是野指针或者数组越界带来的问题,在应用程序中运行这种程序就会报segmentation fault的错误,而由于驱动程序的特殊性,出现此类情况后往往会直接造成系统宕机,并会抛出oops信息.那么我们如何来分析oops信息呢,甚至根据oop

linux设备驱动第四篇:以oops信息定位代码行为例谈驱动调试方法

上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试.在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序,那么驱动程序如何调试呢?我们知道在调试程序时经常遇到的问题就是野指针或者数组越界带来的问题,在应用程序中运行这种程序就会报segmentation fault的错误,而由于驱动程序的特殊性,出现此类情况后往往会直接造成系统宕机,并会抛出oops信息.那么我们如何来分析oops信息呢,甚至根据oop

Linux设备驱动中的阻塞和非阻塞I/O

[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到条件满足. 2.非阻塞 非阻塞操作是指在进行设备操作是,若操作条件不满足并不会挂起,而是直接返回或重新查询(一直占用CPU资源)直到操作条件满足为止. 当用户空间的应用程序调用read(),write()等方法时,若设备的资源不能被获取,而用户又希望以阻塞的方式来访问设备,驱动程序应当在设备驱动层的

(笔记)linux设备驱动--LED驱动

linux设备驱动--LED驱动 最近正在学习设备驱动开发,因此打算写一个系列博客,即是对自己学习的一个总结,也是对自己的一个督促,有不对,不足,需要改正的地方还望大家指出,而且希望结识志同道合的朋友一起学习技术,共同进步. 作者:liufei_learning(转载请注明出处) email:[email protected] IT学习交流群:160855096 转至:http://blog.csdn.net/liufei_learning/article/details/7025246 开发环

Linux设备驱动核心理论(一)

4.Linux内核模块 4.1 Linux内核模块简介 如果把所有需要的功能都编译到Linux内核.这回导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核. 现在我们需要的是一种机制使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中. Linux提供了这样的一种机制,这种机制被称为模块(Module).模块具有这样的特点: 模块本身不被编译如内核映像,从而控制内核的大小. 模块一旦被加载,它就