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

一.    使用原子变量

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;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值