可被信号打断的信号量的驱动代码举例

本文介绍了Linux内核中可被信号打断的信号量API函数down_interruptible的使用,基于之前的8_semaphore工程进行了代码示例,包括工程准备、添加自旋锁后驱动代码的修改以及编译和测试过程,展示了如何在需要信号可以打断的情况下管理并发访问。
摘要由CSDN通过智能技术生成

一.  简介

前面文章学习了Linux内核处理并发与竞争的一种方法:信号量。

主要学习信号量的如何使用。文章地址如下:

Linux内核中信号量的驱动举例-CSDN博客

本文继续信号量的学习,这里主要学习一种可被信号打断的信号量的 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内核中自旋锁驱动代码举例二-CSDN博客

关于 Linux内核的信号量的使用暂时学习到这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值