驱动程序如何支持非阻塞读写操作
Posted 正在起飞的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了驱动程序如何支持非阻塞读写操作相关的知识,希望对你有一定的参考价值。
1、应用层指定非阻塞模式
fd=open("/dev/xxx",O_RDONLY | O_NONBLOCK);
在open打开设备节点时,指定打开方式为非阻塞打开(O_NONBLOCK);
2、驱动代码感知当前操作方式
struct file
······
unsigned int f_flags; //记录文件的属性,比如:O_NONBLOCK 非阻塞
fmode_t f_mode; //记录文件的打开方式,比如:O_RDONLY 只读
······
;
(1)在open打开设备节点时,内核会创建struct file结构体来在内核中表示该文件,其中就记录了O_NONBLOCK非阻塞标志;
(2)在应用层read设备节点时,struct file结构体会传给设备的读方法函数指针;
3、在驱动代码中判断是否要阻塞
static ssize_t hello_read(struct file *filp,char __user *buf,size_t size,loff_t *poss)
int ret = 0;
if(没有数据可读)
//如果是非阻塞方式则马上放回
if(filp->f_flags & O_NONBLOCK)
return -EAGAIN;
//阻塞方式打开,则添加到读数据的等待队列里阻塞住,等待将来有数据可读时再返回
wait_event_interruptible(rwq,flage!=0);
……………
return size;
(1)在驱动的读数据方法中,判断struct file结构体的f_flags标志位是否将O_NONBLOCK置1,如果置1就是非阻塞方式,没有置1就是阻塞方式;
(2)默认是阻塞方式;
以上是关于驱动程序如何支持非阻塞读写操作的主要内容,如果未能解决你的问题,请参考以下文章