驱动程序如何支持非阻塞读写操作

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)默认是阻塞方式;

以上是关于驱动程序如何支持非阻塞读写操作的主要内容,如果未能解决你的问题,请参考以下文章

3.6.1.非阻塞IO

java同步非阻塞IO

java同步非阻塞IO

什么是阻塞式和非阻塞io流?

java nio学习三:NIO 的非阻塞式网络通信

NIO 网络通信