久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区


曙海教育集團(tuán)論壇Linux專區(qū)Linux驅(qū)動(dòng)開發(fā) → 深入淺出Linux設(shè)備驅(qū)動(dòng)之并發(fā)控制(2)


  共有9504人關(guān)注過本帖樹形打印

主題:深入淺出Linux設(shè)備驅(qū)動(dòng)之并發(fā)控制(2)

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


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

下面進(jìn)入對(duì)并發(fā)控制的實(shí)戰(zhàn)。首先,在globalvar的驅(qū)動(dòng)程序中,我們可以通過信號(hào)量來控制對(duì)int global_var的并發(fā)訪問,下面給出源代碼:

#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)
{
 //獲得信號(hào)量
 if (down_interruptible(&sem))
 {
  return - ERESTARTSYS;
 }

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

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

 return sizeof(int);
}

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

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

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

module_init(globalvar_init);
module_exit(globalvar_exit);

  接下來,我們給globalvar的驅(qū)動(dòng)程序增加open()和release()函數(shù),并在其中借助自旋鎖來保護(hù)對(duì)全局變量int globalvar_count(記錄打開設(shè)備的進(jìn)程數(shù))的訪問來實(shí)現(xiàn)設(shè)備只能被一個(gè)進(jìn)程打開(必須確保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);

  為了上述驅(qū)動(dòng)程序的效果,我們啟動(dòng)兩個(gè)進(jìn)程分別打開/dev/globalvar。在兩個(gè)終端中調(diào)用./globalvartest.o測(cè)試程序,當(dāng)一個(gè)進(jìn)程打開/dev/globalvar后,另外一個(gè)進(jìn)程將打開失敗,輸出"device open failure",如下圖:

圖片點(diǎn)擊可在新窗口打開查看
輸出結(jié)果

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

返回版面帖子列表

深入淺出Linux設(shè)備驅(qū)動(dòng)之并發(fā)控制(2)








簽名
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
色综合久久av| 国产一区二区三区av电影| 日韩欧美精品三级| 欧美日韩在线一区二区| 日本福利一区二区| 91官网在线免费观看| 一本色道a无线码一区v| 一本大道综合伊人精品热热| 视频一区国产精品| 日韩国产一区久久| 亚洲三级一区| 91行情网站电视在线观看高清版| 91成人看片片| 欧美日韩国产小视频在线观看| 色老汉一区二区三区| 在线亚洲人成电影网站色www| 在线一区二区三区| 欧美一级生活片| 久久九九影视网| 亚洲三级电影网站| 亚洲一区二区三区不卡国产欧美| 石原莉奈在线亚洲二区| 久久99精品国产| 成人精品在线视频观看| 成人综合色站| 一区二区视频在线观看| 美国三级日本三级久久99| 蜜乳av一区二区三区| 国产一区二区日韩精品| 99精品久久只有精品| 久久久com| 欧美性猛交一区二区三区精品| 日韩欧美一区二区视频| 亚洲欧洲www| 久久精品久久精品| 99在线首页视频| 色妹子一区二区| 久久综合给合久久狠狠狠97色69| 1区2区3区精品视频| 麻豆成人免费电影| http;//www.99re视频| 色婷婷av一区二区三区软件 | 在线精品视频一区二区| 欧美不卡在线视频| 色综合天天综合| 欧美精品一区二| 亚洲成人动漫一区| k8久久久一区二区三区| 中国成人亚色综合网站| 久久精品视频一区二区| 日本亚洲三级在线| 国产精品国产精品国产专区蜜臀ah | 亚洲欧洲三级电影| 精品综合久久久久久8888| 国产伦精品一区二区| 911精品国产一区二区在线| 亚洲少妇屁股交4| 国产成人在线观看| 亚洲视频在线一区| 国产91丝袜在线观看| 91免费看片在线观看| 韩国欧美国产1区| 成人动漫视频在线观看完整版 | 蜜桃久久久久久久| 久久久久久久久久久久久久一区| 欧美日韩视频专区在线播放| 综合在线观看色| 成人丝袜高跟foot| 欧美在线制服丝袜| 一区在线播放视频| 成人app网站| 欧美自拍偷拍午夜视频| 亚洲欧美国产毛片在线| 91视频观看视频| 欧美精品久久99| 午夜精品福利在线| 精品无人乱码一区二区三区的优势| 91麻豆精品国产91久久久使用方法 | 欧洲精品久久| 国产精品免费视频网站| 成人晚上爱看视频| 欧美精品三级在线观看| 日韩高清在线电影| 性刺激综合网| 一区二区三区四区在线免费观看| 99视频一区二区| 日韩欧美三级在线| 国产精品小仙女| 欧美精品日韩一本| 国产高清不卡一区二区| 欧美午夜电影一区| 日日摸夜夜添夜夜添精品视频| 看国产成人h片视频| 中国色在线观看另类| 国产蜜臀97一区二区三区 | 国产伦精品一区二区三区视频黑人| 欧美一级高清片| 激情av综合网| 欧美群妇大交群的观看方式| 美女视频网站久久| 亚洲人成网站在线观看播放| 一区二区三区四区乱视频| 欧美13一14另类| 亚洲一区二区三区四区五区黄| 精品九九九九| 亚洲精品国产无天堂网2021| 久久99欧美| 亚洲一区二区欧美激情| 亚洲激情一区二区三区| 日韩电影免费在线| 欧美浪妇xxxx高跟鞋交| 国产成a人无v码亚洲福利| 色播五月激情综合网| 成人18精品视频| 麻豆av一区二区三区| 精品久久久久久久久久久久久久久| 男女激情视频一区| 欧美日韩视频在线观看一区二区三区| 麻豆精品久久久| 在线播放欧美女士性生活| 国产乱色国产精品免费视频| 欧美一区二区三区的| 成+人+亚洲+综合天堂| 久久久精品天堂| 国产高清不卡av| 亚洲午夜一区二区| 欧美视频三区在线播放| 成人sese在线| 国产精品美女久久久久aⅴ| 婷婷久久伊人| 国产乱码精品一区二区三区av| 精品国产123| 日韩免费高清av| 777亚洲妇女| 亚洲乱码国产乱码精品天美传媒| 亚洲精品视频一二三| 国产欧美精品一区二区色综合朱莉| 懂色av一区二区三区在线播放| 亚洲精品网站在线观看| 91福利区一区二区三区| 成人免费毛片aaaaa**| 国产欧美一区二区精品忘忧草| 欧美亚洲国产免费| 加勒比av一区二区| 欧美国产精品一区二区三区| 日韩免费三级| 粉嫩av亚洲一区二区图片| 国产精品色在线观看| 一区二区三区四区五区精品| 成人动漫av在线| 亚洲图片欧美视频| 日韩一级片网址| 在线视频亚洲自拍| 国产乱码精品一区二区三区中文| 一区二区三区日韩精品| 5566中文字幕一区二区电影| 国产精品一区二区三区观看| 日韩在线观看一区二区| 久久综合九色综合97_久久久| 日韩一区二区电影在线观看| 岛国一区二区三区| 丝袜诱惑亚洲看片| 国产精品毛片高清在线完整版| 91国偷自产一区二区开放时间| 99久久国产免费免费| 麻豆精品在线播放| 中文字幕视频一区| 欧美日韩高清影院| 欧美韩国日本精品一区二区三区| 91麻豆精品国产| 精品国产免费人成电影在线观...| 韩国精品免费视频| 亚洲你懂的在线视频| 精品国产麻豆免费人成网站| 日韩久久久久久久| 114国产精品久久免费观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲综合激情另类小说区| 精品精品欲导航| 色爱区综合激月婷婷| 国产精品久久久久久久免费大片| 婷婷中文字幕综合| 国产精品国产精品国产专区不片| 欧美在线高清视频| 欧美亚洲精品日韩| 国产成人精品免费视频大全最热| 国产真实乱偷精品视频免| 亚洲国产精品人人做人人爽| 中文天堂在线一区| 欧美变态tickling挠脚心| 欧美性大战久久久久久久蜜臀| 欧美在线3区| 国产精品一区二区av| av中文字幕在线不卡| 国产中文一区二区三区| 亚洲chinese男男1069| 亚洲视频一二三区| 中文字幕欧美激情| 日本一区二区三区免费乱视频| 成人妖精视频yjsp地址|