【讯为Linux驱动开发】7.信号量semaphore

【信号量】

信号量的本质是一个全局变量,值为可以共享资源的最大数

比如:我只想同时让一个人访问共享资源,那么信号量的值为1。

A访问时,信号量减一,此时B想访问时,看到信号量为0,就休眠挂起。等A释放,使得信号量加一,B可以启动。

【函数】

DEFINE SEAMPHORE(name)  描述定义信号量,并设置信号量的值为1
void sema init(struct semaphore *sem. int val)  初始化信号量sem并设置信号的值为al
void down(struct semaphore *sem)  获取信号量。不能被信号打断,如ctr+c
int down interruptible(struct semaphore *sem)  获取信号量。能被信号打断,如ct+c

void up(struct semaphore *sem)  释放信号量

int down trylock(struct semaphore *sem)   尝试获取信号量,如果获取到信号量就返回0,获取不到就返回非0

【注意事项】 

  1. 信号量的值 > 0
  2. 访问共享资源 +1 ,访问完成 -1
  3. 当信号量的值为0,再想访问的线程必须等待直到信号量值大于0
  4. 信号量引起休眠,所以中断中不可使用

【实验】

/* 定义一个自旋锁 */
static struct semaphore my_semlock;


static int moduleparam_init()
{
    sema_init(my_semlock, 1); //初始化信号量,值设置为1
    ...
    ...
}


static int cdev_open(struct inode *inode, struct file *filp)
{
    //在open中减一,使用可被ctrl+c打断的函数
    if(down_interruptible(&semlock){
        return -EINTR;    
    }
       
    file->private_data = &dev1; //指向设备结构体
    return 0;
}


static int cdev_release(struct inode *inode, struct file *filp)
{
    up(&semlock); //信号量 加1
}

【实验结果】

先打开a.out 成功,执行b.out的时候等待5秒,打印closeOK 后再执行b.out

可被ctrl+c打断的函数:down_interruptible(&semlock)

指的是执行b.out的时候我按ctrl + c就可以使b进程不再等待跳出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值