本文共 2136 字,大约阅读时间需要 7 分钟。
阻塞方式是文件读写操作的默认方式,但是应用程序员可通过使用O_NONBLOCK 标志来人为
的设置读写操作为非阻塞方式 .( 该标志定义在 < linux/fcntl.h > 中,在打开文件时指定 ) .
在设计简单字符驱动程序时,要注意一个重要问题.
当一个设备无法立刻满足用户的读写请求时应当如何处理?
例如:调用 read 时没有数据可读,但以后可能会有;
或者一个进程试图向设备写入数据,但是设备暂时没有准备好接收数据.
应用程序通常不关心这种问题,应用程序只是调用 read 或 write 并得到返回值.
驱动程序应当 ( 缺省地 ) 阻塞进程,使它进入睡眠,直到请求可以得到满足.
是指在执行设备操作时,若不能获得资源则挂起进程,直到满足可操作的条件后进行操作,
被挂起的进程进入睡眠状态,被从调度器的运行队列移走,直到等待的条件被满足.
进程不能进行设备操作时并不挂起,他或者放弃,或者不停的查询,直到可以进行操作为止.
在阻塞型驱动程序中,read 实现方式如下:
如果进程调用 read ,但设备 没有数据 或 数据不足,进程阻塞.
当新数据到达后,唤醒被阻塞进程.
在阻塞型驱动程序中,write 实现方式如下:
如果进程调用了 write ,但设备 没有足够的空间供其写入数据,进程阻塞.
当设备中的数据被读走后,缓冲区中空出部分空间,则唤醒进程.
阻塞方式是文件读写操作的默认方式,但是应用程序员可通过使用O_NONBLOCK 标志来人为
的设置读写操作为非阻塞方式 .( 该标志定义在 < linux/fcntl.h > 中,在打开文件时指定 ) .
如果设置了 O_NONBLOCK 标志,read 和 write 的行为是不同的 ,如果进程没有数据就绪时调用了 read ,
或者在缓冲区没有空间时调用了 write ,系统只是简单的返回 -EAGAIN,而不会阻塞进程.
file 结构体中含有 f_flags 标志位,看是 阻塞方式 还是 非阻塞方式:
O_NONBLOCK 为 非阻塞方式;
[cpp]
[cpp]
1,以阻塞方式运行:
后台执行应用程序,进程处于睡眠状态,按下按键,立马打印按键号;
[cpp]
2,以非阻塞方式运行:
open 驱动程序的时候,传入标志 O_NONBLOCK 非阻塞;
后台执行应用程序:
[cpp]
非阻塞方式,没有按键值按下,程序立马返回;
read 返回值 为 -1;转载地址:http://cuexi.baihongyu.com/