【信号量】
信号量的本质是一个全局变量,值为可以共享资源的最大数
比如:我只想同时让一个人访问共享资源,那么信号量的值为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+cvoid up(struct semaphore *sem) 释放信号量
int down trylock(struct semaphore *sem) 尝试获取信号量,如果获取到信号量就返回0,获取不到就返回非0
【注意事项】
- 信号量的值 > 0
- 访问共享资源 +1 ,访问完成 -1
- 当信号量的值为0,再想访问的线程必须等待直到信号量值大于0
- 信号量引起休眠,所以中断中不可使用
【实验】
/* 定义一个自旋锁 */
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进程不再等待跳出来。