第二章2.阻塞与非阻塞操作时间延时合编.ppt

第二章2.阻塞与非阻塞操作时间延时合编.ppt

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Neusoft Institute of Information Date: 9 3 2010 IT Education Training Neusoft Institute of Information 电子工程系-- 嵌入式Linux驱动设备开发 目录 一 阻塞型设备驱动 三 定时、延时 POLLPOLL方法 二 前一节我们在设计简单字符驱动程序时,跳过了一个重要的问题:当一个设备无法立刻满足用户的读写请求时应当如何处理? 例如:调用read时没有数据可读, 但以后可能会有;或者一个进程试图向设备写入数据,但是设备暂时没有准备好接收数据。应用程序通常不关心这种问题,应用程序只是调用read 或write 并得到返回值。驱动程序应当(缺省地)阻塞进程,使它进入睡 眠,直到请求可以得到满足。 阻塞型字符设备驱动 在阻塞型驱动程序中,Read实现方式如下: 如果进程调用read,但设备没有数据或 数据不足,进程阻塞。当新数据到达后, 唤醒被阻塞进程。 阻塞型方式 在阻塞型驱动程序中,Write实现方式如下: 如果进程调用了write,但设备没有足够的空 间供其写入数据,进程阻塞。当设备中的数 据被读走后,缓冲区中空出部分空间,则唤 醒进程。 阻塞型方式 阻塞方式是文件读写操作的默认方式,但 应用程序员可通过使用O_NONBLOCK 标志来人为的设置读写操作为非阻塞方式 (该标志定义在linux/fcntl.h中,在打 开文件时指定)。 非阻塞型方式 如果设置了O_NONBLOCK标志,read 和write的行为是不同的。如果进程在没 有数据就绪时调用了read,或者在缓冲 区没有空间时调用了write,系统只是简 单地返回-EAGAIN,而不会阻塞进程。 非阻塞型方式 实例分析 什么是Poll方法,功能是什么? 系统调用(用户空间) 驱动(内核空间) Open Open Close Release Read Read Write Write Ioctl Ioctl lseek llseek Select Poll poll 和 select Select系统调用 Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程。 int select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, const struct timeval *timeout) Select系统调用 Maxfd: 文件描述符的范围,比待检测的最大文件描述符大1 Readfds: 被读监控的文件描述符集 Writefds: 被写监控的文件描述符集 Exceptfds: 被异常监控的文件描述符集; Timeout: 定时器 Select系统调用 Timeout取不同的值,该调用有不同的表现: Timeout值为0,不管是否有文件满足要求,都立刻返 回,无文件满足要求返回0,有文件满足要求返回一个 正值。 Timeout为NULL,select将阻塞进程,直到某个文件 满足要求 Timeout值为正整数,就是等待的最长时间,即 select在timeout时间内阻塞进程。 Select系统调用 Select调用返回时,返回值有如下情况: 1.正常情况下返回满足要求的文件描述符个数; 2.经过了timeout等待后仍无文件满足要求,返 回值为0; 3.如果select被某个信号中断,它将返回-1并设 置errno为EINTR。 4.如果出错,返回-1并设置相应的errno。 Select系统调用 1. 将要监控的文件添加到文件描述符集 2. 调用Select开始监控 3. 判断文件是否发生变化 Select系统调用 系统提供了4个宏对描述符集进行操作: #include sys/select.h void FD_SET(int fd, fd_set *fdset) void FD_CLR(int fd, fd_set *fdset) void FD_ZERO(fd_set *fdset) void FD_ISSET(int fd, fd_set *fdset) 宏FD_SET将文件描述符fd添加到文件描述符集fdset中; 宏FD_CLR从文件描述符集fdset中清除文件描述符fd; 宏FD_ZERO清空文件描述符集fdset; 在调用select后使用FD_ISSET来检测文件描述符集fdset中的文件fd发生了变化。 Select系统调用 FD_ZERO(fds); //清空集合 FD_SET(fd1,fds); //设置描述符 FD_SE

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档