亚洲欧美激情另类校园_欧美理论电影在线播放_国产精品久久久一区_久久99国产精品久久久久久久久_亚洲人成网站999久久久综合_日韩av日韩在线观看_欧美精品激情在线_…久久精品99久久香蕉国产_亚洲最大福利网站_久久精品欧美视频_国产精品免费视频久久久_欧美一区二区三区图_国产精品一区二区久久精品_中国日韩欧美久久久久久久久_亚洲免费福利视频_最新69国产成人精品视频免费


曙海教育集團論壇Linux專區Linux驅動開發 → 深入淺出Linux設備驅動之并發控制(2)


  共有12720人關注過本帖樹形打印

主題:深入淺出Linux設備驅動之并發控制(2)

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信
等級:青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊:2010-11-12 11:08:23
深入淺出Linux設備驅動之并發控制(2)  發帖心情 Post By:2010-11-24 11:46:56

下面進入對并發控制的實戰。首先,在globalvar的驅動程序中,我們可以通過信號量來控制對int global_var的并發訪問,下面給出源代碼:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/semaphore.h>
MODULE_LICENSE("GPL");

#define MAJOR_NUM 254

static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*);
static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);

struct file_operations globalvar_fops =
{
 read: globalvar_read, write: globalvar_write,
};
static int global_var = 0;
static struct semaphore sem;

static int __init globalvar_init(void)
{
 int ret;
 ret = register_chrdev(MAJOR_NUM, "globalvar", &globalvar_fops);
 if (ret)
 {
  printk("globalvar register failure");
 }
 else
 {
  printk("globalvar register success");
  init_MUTEX(&sem);
 }
 return ret;
}

static void __exit globalvar_exit(void)
{
 int ret;
 ret = unregister_chrdev(MAJOR_NUM, "globalvar");
 if (ret)
 {
  printk("globalvar unregister failure");
 }
 else
 {
  printk("globalvar unregister success");
 }
}

static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
 //獲得信號量
 if (down_interruptible(&sem))
 {
  return - ERESTARTSYS;
 }

 //將global_var從內核空間復制到用戶空間
 if (copy_to_user(buf, &global_var, sizeof(int)))
 {
  up(&sem);
  return - EFAULT;
 }

 //釋放信號量
 up(&sem);

 return sizeof(int);
}

ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)
{
 //獲得信號量
 if (down_interruptible(&sem))
 {
  return - ERESTARTSYS;
 }

 //將用戶空間的數據復制到內核空間的global_var
 if (copy_from_user(&global_var, buf, sizeof(int)))
 {
  up(&sem);
  return - EFAULT;
 }

 //釋放信號量
 up(&sem);
 return sizeof(int);
}

module_init(globalvar_init);
module_exit(globalvar_exit);

  接下來,我們給globalvar的驅動程序增加open()和release()函數,并在其中借助自旋鎖來保護對全局變量int globalvar_count(記錄打開設備的進程數)的訪問來實現設備只能被一個進程打開(必須確保globalvar_count最多只能為1):

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/semaphore.h>

MODULE_LICENSE("GPL");

#define MAJOR_NUM 254

static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*);
static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);
static int globalvar_open(struct inode *inode, struct file *filp);
static int globalvar_release(struct inode *inode, struct file *filp);

struct file_operations globalvar_fops =
{
 read: globalvar_read, write: globalvar_write, open: globalvar_open, release:
globalvar_release,
};

static int global_var = 0;
static int globalvar_count = 0;
static struct semaphore sem;
static spinlock_t spin = SPIN_LOCK_UNLOCKED;

static int __init globalvar_init(void)
{
 int ret;
 ret = register_chrdev(MAJOR_NUM, "globalvar", &globalvar_fops);
 if (ret)
 {
  printk("globalvar register failure");
 }
 else
 {
  printk("globalvar register success");
  init_MUTEX(&sem);
 }
 return ret;
}

static void __exit globalvar_exit(void)
{
 int ret;
 ret = unregister_chrdev(MAJOR_NUM, "globalvar");
 if (ret)
 {
  printk("globalvar unregister failure");
 }
 else
 {
  printk("globalvar unregister success");
 }
}

static int globalvar_open(struct inode *inode, struct file *filp)
{
 //獲得自選鎖
 spin_lock(&spin);

 //臨界資源訪問
 if (globalvar_count)
 {
  spin_unlock(&spin);
  return - EBUSY;
 }
 globalvar_count++;

 //釋放自選鎖
 spin_unlock(&spin);
 return 0;
}

static int globalvar_release(struct inode *inode, struct file *filp)
{
 globalvar_count--;
 return 0;
}

static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t
*off)
{
 if (down_interruptible(&sem))
 {
  return - ERESTARTSYS;
 }
 if (copy_to_user(buf, &global_var, sizeof(int)))
 {
  up(&sem);
  return - EFAULT;
 }
 up(&sem);
 return sizeof(int);
}

static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len,
loff_t *off)
{
 if (down_interruptible(&sem))
 {
  return - ERESTARTSYS;
 }
 if (copy_from_user(&global_var, buf, sizeof(int)))
 {
  up(&sem);
  return - EFAULT;
 }
 up(&sem);
 return sizeof(int);
}

module_init(globalvar_init);
module_exit(globalvar_exit);

  為了上述驅動程序的效果,我們啟動兩個進程分別打開/dev/globalvar。在兩個終端中調用./globalvartest.o測試程序,當一個進程打開/dev/globalvar后,另外一個進程將打開失敗,輸出"device open failure",如下圖:

圖片點擊可在新窗口打開查看
輸出結果

支持(0中立(0反對(0單帖管理 | 引用 | 回復 回到頂部

返回版面帖子列表

深入淺出Linux設備驅動之并發控制(2)








簽名
亚洲欧美激情另类校园_欧美理论电影在线播放_国产精品久久久一区_久久99国产精品久久久久久久久_亚洲人成网站999久久久综合_日韩av日韩在线观看_欧美精品激情在线_…久久精品99久久香蕉国产_亚洲最大福利网站_久久精品欧美视频_国产精品免费视频久久久_欧美一区二区三区图_国产精品一区二区久久精品_中国日韩欧美久久久久久久久_亚洲免费福利视频_最新69国产成人精品视频免费
精品一区二区三区免费观看| 成人午夜国产| 欧美大片免费观看在线观看网站推荐| 粉嫩欧美一区二区三区高清影视| 欧美性色综合| 日本在线影院| 久久免费精品日本久久中文字幕| 欧美成人视屏| 久久精品91久久久久久再现| 91精品国产综合久久久蜜臀图片| 欧美一区午夜视频在线观看| 欧美久色视频| 亚洲尤物视频网| 99国产精品99久久久久久| 精品1区2区| 老司机精品视频网| 亚洲美女免费精品视频在线观看| 黄网在线免费看| 亚洲影院色在线观看免费| 91精品导航| 夜夜嗨av一区二区三区四区| 成人免费淫片aa视频免费| 亚洲国产婷婷| 国产精品三级在线观看| 欧美成人免费小视频| 玖玖玖国产精品| 亚洲欧美日韩国产另类专区| 中文字幕va一区二区三区| 欧美xx视频| 成人性教育av免费网址| 欧美孕妇孕交黑巨大网站| 成人免费视频网址| x99av成人免费| 蜜桃视频第一区免费观看| 欧美性大战久久久久久久蜜臀| 麻豆视频在线观看免费网站黄| 69久成人做爰电影| 欧美日韩国产123区| 不卡视频一区二区三区| 精品中文字幕一区二区三区| 美女脱光内衣内裤视频久久网站| 在线观看视频一区| 宅男66日本亚洲欧美视频| 亚洲精品欧美激情| 日韩中文在线不卡| 成人影院在线| 国产精品av电影| 中文字幕综合在线| 久草成色在线| 97视频在线观看免费高清完整版在线观看| 成人乱色短篇合集| 欧美大人香蕉在线| 欧美另类综合| 亚洲国产精品www| 中文日韩在线观看| 国产精品久久久久久久久久尿| 国产精品免费视频xxxx| 寂寞少妇一区二区三区| 欧美激情xxxx性bbbb| 奇米精品一区二区三区在线观看一| 欧美一级大胆视频| 国产传媒av在线| 日韩高清国产一区在线| 亚洲深爱激情| 羞羞视频在线观看免费| 自拍偷拍亚洲综合| 国产亚洲成av人片在线观黄桃| 久久国产精品72免费观看| 牛牛电影国产一区二区| 91麻豆国产福利精品| 成人黄色大片在线免费观看| 欧美噜噜久久久xxx| 国产精品不卡视频| 在线观看涩涩| 精品在线免费视频| 精品国产123区| 国产乱码精品一品二品| 中文字幕日韩一区二区| yy111111少妇影院日韩夜片| 亚洲国产视频在线| 欧美一区二区三区精美影视| 日韩一区和二区| 成人羞羞在线观看网站| 久久精品免费在线观看| 久久99精品久久久久久久久久| 亚洲性视频大全| 国产欧美在线观看免费| 国产日韩欧美高清在线| 日韩在线免费观看视频| 亚洲精品国产偷自在线观看| 国精产品一区二区三区有限公司| 久久综合久久久久88| 欧美日韩一区二区三区视频播放| 亚洲视频第一页| 亚洲欧洲精品一区二区三区不卡| 久久久水蜜桃| 国产精品区二区三区日本| 欧美日本精品一区二区三区| 日韩精品一级| 色阁综合伊人av| 欧美日韩一卡二卡| 最新国产精品久久精品| 搞黄视频在线观看| 欧美日韩视频免费播放| 欧美 日韩 国产在线| 精品国产一区二区三区久久狼5月| 久久精品国产亚洲aⅴ| 亚洲尤物视频在线| 蜜臀av一区二区三区| 色999久久久精品人人澡69| 浪潮av一区| 欧美美女日韩| 青青草国产精品97视觉盛宴| av理论在线观看| 国产精品美女久久久久av超清| 1卡2卡3卡精品视频| 超碰caoporn久久| 91高清在线免费观看| 精品影院一区二区久久久| 欧美经典影片视频网站| 免费在线观看av网站| 麻豆精品在线看| 国产精品第四页| 女厕盗摄一区二区三区| 国产成人精品久久久| 国产999精品久久久久久绿帽| 国产一区精品视频| xxxx在线视频| 国产青春久久久国产毛片| 欧美激情在线观看视频| 国产日韩一区二区三区在线| 精品国产免费一区二区三区香蕉| 久久av老司机精品网站导航| 欧美在线在线| 欧美日韩一区二区免费视频| 欧美综合自拍| 美女毛片一区二区三区四区| 精品96久久久久久中文字幕无| 国产精品久久久av久久久| 日韩一区二区三区免费视频| 欧美国产成人精品| 日韩经典中文字幕| 欧美日韩国产色视频| 婷婷综合视频| 欧美日韩国产va另类| 黄色视屏在线免费观看| 精品国产一区二区三区在线观看| 在线观看网站免费入口在线观看国内| 成人黄色免费在线观看| 在线观看av黄网站永久| 5858s免费视频成人| 日本在线观看高清完整版| 91国偷自产一区二区三区成为亚洲经典| 26uuu久久天堂性欧美| 色噜噜久久综合伊人一本| 亚洲欧美国产精品专区久久| 亚洲一卡久久| 欧美在线视频全部完| 国产老妇另类xxxxx| 欧美巨猛xxxx猛交黑人97人| 欧美日韩一级片在线观看| 欧美成人精品三级网站| 色999日韩自偷自拍美女| 精品久久人人做人人爱|