您的位置:首页 > 运维架构 > Linux

linux字符驱动之同步互斥按键驱动

2018-02-23 17:14 459 查看
上一节里,我们将在上一节的基础上修改驱动,将其修改为有异步通知功能的按键驱动,目标是,按下按键时,驱动主动去通知应用程序。是不是感觉驱动已经比较完善了,好像已经是完美无缺了?是不是这样呢?好像不是呢,有没有这么一种情况,多个进程想同时使用驱动的设备节点?在多线的环境下,分分钟可能会发生这种情况。上一节文章链接:http://blog.sina.com.cn/s/blog_636a55070101wr10.html在这一节里,我们在上一节的基础上,实现同一时刻只能有一个进程使用同一个设备,例如:只能有一个进程,在同一时刻里使用/dev/buttons这个设备。问:如何实现同一时刻只能有一个进程使用某个设备?答:使用linux互斥机制问:linux互斥机制有哪些?答:有很多种,如:原子变量、互斥锁、信号量、自旋锁、读写锁等等问:在这一节里,我们使用什么互斥机制?答:原子变量/信号量,举二个例子来示范linux的互斥机制问:如何使用原子变量的互斥机制?答:先定义一个原子变量,然后再初始化它。具体如下: 
static>
问:与原子变量相关的函数有哪些?

答:原子操作指的是在执行过程中不会被别的代码路径所中断的操作,常用原子操作函数举例:
atomic_t>
问:原子变量相关的函数在此驱动里,在哪来会被调用?

答:既然是防止多个进程打开同一个设备,那自然是在open函数就调用,在close函数也会被调用,示例如下:
static>

原子变量互斥方式应用测试程序源码:
#include
#include
#include
#include
#include
#include

/*>

原子变量互斥方式测试步骤:
[WJ2440]#>

信号量互斥方式应用测试程序源码:
#include
#include
#include
#include
#include      //sleep
#include
#include
#include

int>
信号量互斥方式测试步骤:
[WJ2440]# lsQt             fifth_drv.ko   lib            sddisk         third_testTQLedtest      fifth_test     linuxrc        second_drv.ko  tmpapp_test       first_drv.ko   mnt            second_test    udiskbin            first_test     opt            sixth_drv.ko   usrdev            fourth_drv.ko  proc           sixth_test     vardriver_test    fourth_test    root           sys            webetc            home           sbin           third_drv.ko[WJ2440]# insmod sixth_drv.ko[WJ2440]# lsmodsixth_drv 3472 0 - Live 0xbf000000[WJ2440]# ls /dev/buttons -lcrw-rw----    1 root     root      252,   0 Jan  2 04:47 /dev/buttons[WJ2440]# ./sixth_test &[WJ2440]# ./sixth_test &[WJ2440]# psPID USER       VSZ STAT COMMAND1 root      2088 S    init2 root         0 SW<  [kthreadd]3 root         0 SW<  [ksoftirqd/0]4 root         0 SW<  [events/0]5 root         0 SW<  [khelper]11 root         0 SW<  [async/mgr]237 root         0 SW<  [kblockd/0]247 root         0 SW<  [khubd]254 root         0 SW<  [kmmcd]278 root         0 SW   [pdflush]279 root         0 SW   [pdflush]280 root         0 SW<  [kswapd0]325 root         0 SW<  [aio/0]329 root         0 SW<  [nfsiod]333 root         0 SW<  [crypto/0]443 root         0 SW<  [mtdblockd]557 root         0 SW<  [usbhid_resumer]573 root         0 SW<  [rpciod/0]587 root      1508 S    EmbedSky_wdg589 root      2092 S    -/bin/sh590 root      2088 S    /usr/sbin/telnetd -l /bin/login602 root      1428 S    ./sixth_test603 root      1428 D    ./sixth_test604 root      2092 R    ps
由上面的测试结果可知:当多次执行./sixth_test &时,可发现进程602的状态为S即睡眠状态,而进程603的状态为D即僵死状态,只有当我们杀死602进程时,603的状态才能变为S正常状态,这也就达到了互斥的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: