代码来源: Linux设备驱动开发详解(宋宝华) p169
static atomic_t xxx_available = ATOMIC_INIT(1);
static int xxx_open (struct inode *inode, struct file *filp)
{
...
if(!atomic_dec_and_test(&xxx_available)) {
atomic_inc(&xxx_available);
return -EBUSY; //已经打开
}
...
return 0;
}
static int xxx_release(struct inode *inode, struct file *filp)
{
atomic_inc(&xxx_available); //释放设备
return 0;
}
① static atomic_t xxx_available = ATOMIC_INIT(1); 首先在驱动中定义了原子变量xxx_available,并初始化为1.
② atomic_dec_and_test(&atomic_param)函数的功能实现对原子变量atomic_param自减1,并判断是否等于0,若为0则返回True,否则返回false.
③ 当应用打开驱动的时候会执行xxx_open函数,并实现原子变量的自减,由于原子变量初始化为1,执行完atomic_dec_and_test函数后返回True,由于!符号的存在,不会执行if条件语句。
④ 当有第二个应用访问驱动的时候,atomic_dec_and_test会返回false,因此会执行if条件语句,并返回-EBUSY.从而实现了对驱动的互斥访问.
⑤ 最后再驱动出口函数中释放原子变量。