一. 简介
前面文章学习了Linux内核处理并发与竞争的一种方法:信号量。
主要学习信号量的如何使用。文章地址如下:
本文继续信号量的学习,这里主要学习一种可被信号打断的信号量的 API函数。
二. 可被信号打断的信号量的驱动代码举例
1. 准备工程代码
这里在前面 8_semaphore工程代码的基础上,进行更改。通过 vscode软件打开 8_semaphore工程代码。
这里所使用的信号量 API函数不同于前面信号量的为:
函数 | 描述 |
int down_interruptible(struct semaphore *sem)
|
获取信号量,和 down 类似,只是使用 down 进
入休眠状态的线程不能被信号打断。而使用此
函数进入休眠以后是可以被信号打断的。
|
2. 添加自旋锁代码后的驱动代码
semaphore.c文件代码中,唯一需要更改的是 open函数中关于获取信号量代码的更改。所以,这里只列出 gpioled_open()函数:
static int gpioled_open(struct inode *inode, struct file *filp)
{
down_interruptible(&gpioled.sem_lock);//获取信号量
filp->private_data = &gpioled;
return 0;
}
在Linux系统中在使用到信号量时,可能会用到 down_interruptible()函数多一些。因为有时候需要信号可以打断。
三. 驱动编译并测试
1. 编译驱动
ubuntu终端进入 8_semaphore工程目录下,编译驱动:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/8_semaphore$ make
make -C /home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga M=/home/wangtian/zhengdian_Linux/Linux_Drivers/8_semaphore modules
make[1]: 进入目录“/home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga”
CC [M] /home/wangtian/zhengdian_Linux/Linux_Drivers/8_semaphore/semaphore.o
/home/wangtian/zhengdian_Linux/Linux_Drivers/8_semaphore/semaphore.c: 在函数‘gpioled_open’中:
/home/wangtian/zhengdian_Linux/Linux_Drivers/8_semaphore/semaphore.c:38:5: 警告: ignoring return value of ‘down_interruptible’, declared with attribute warn_unused_result [-Wunused-result]
down_interruptible(&gpioled.sem_lock);//获取信号量
^
Building modules, stage 2.
MODPOST 1 modules
CC /home/wangtian/zhengdian_Linux/Linux_Drivers/8_semaphore/semaphore.mod.o
LD [M] /home/wangtian/zhengdian_Linux/Linux_Drivers/8_semaphore/semaphore.ko
make[1]: 离开目录“/home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga”
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/8_semaphore$
可以看出,可以编译通过。这是只是提示 warnning信息:没有处理down_interruptible()函数的返回值。
2. 测试驱动
这里经过测试,添加了 信号量的驱动程序,可以保证一次只能一个应用程序访问Led设备。
测试方法之前的文章已经做了详细的说明,文章地址如下:
关于 Linux内核的信号量的使用暂时学习到这里。