您的位置:首页 > 其它

实现设备只能被一个进程打开

2013-11-14 10:05 148 查看
一. 使用原子变量

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;
//第一次打开,if内测试变量自减后是否为0,为0返回ture,取反则条件不成立,第二次打开时自减后不为0,返回false,取反条件成立,退出
...
return 0;
}
static int xxx_release(struct inode *inode, struct file *filp)
{
atmomic_inc(&xxx_available);
return 0;
}
}


二 . 使用自选锁

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;
}
三 . 信号量

static DECLARE_MUTEX(xxx_lock);
/*strcut semaphore sem
* init_MUTEX(&sem);
* 2.6.25版本后不适用init_MUTEX,用sema_init(sem,1)代替
*/
static int xxx_open(struct inode *inode, struct file *filep)
{
...
if(down_trylock(&xxx_lock))  //第一次打开获取锁,第二次打开不能获取
return -EBUSY;
...
return 0;
}
static int xxx_release(struct inode,struct file *filp)
{
up(&xxx_lock);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: