代码来源: Linux设备驱动开发详解(宋宝华) p172
int xxx_count = 0; //定义文件打开次数
static int xxx_open(struct inode *inode,struct file *filp)
{
...
spinlock(&xxx_lock);
if(xxx_count) {
spin_unlock(&xxx_lock);
return -EBUSY;
}
xxx_count++;
spin_unlock(&xxx_lock);
...
return 0;
}
static int xxx_release(struct inode *inode,struct file *filp)
{
...
spinlock(&xxx_lock);
xxx_count--;
spin_unlock(&xxx_lock);
return 0;
}
①int xxx_count = 0; 首先在驱动中定义一个变量保存设备代开的次数
②当应用打开驱动的时候会执行spinlock(&xxx_lock)函数,获取自旋锁,然后判断xxx_count是否已经打开过了,由于第一次打开的时候xxx_count为0,所以不会执行if中的语句。所以直接执行xxx_count++,然后释放自旋锁。
③当有第二个应用打开设备驱动的时候,首先获取自旋锁,此时由于xxx_count = 1,所以会执行if中的语句,直接释放自旋锁,并返回设备忙。从而实现设备的互斥访问。
④在驱动出口函数中实现xxx_count自减
注意:
获取自旋锁的时间段内,如果有其他应用访问该设备,则会处于忙等待,CPU会循环执行获取锁,不做其他工作,因此自旋锁保护的代码应尽可能短。