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


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


  共有9503人關(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欧美一区二区三区
日本麻豆一区二区三区视频| 亚洲一区二区三区四区中文| 麻豆成人久久精品二区三区小说| 亚洲精品日韩专区silk| 国产精品久久久久一区| 亚洲婷婷在线视频| 亚洲一区二区三区影院| 日韩电影免费在线观看网站| 久久国产精品72免费观看| 激情文学综合插| 国产精品一区二区三区99| a美女胸又www黄视频久久| 春色成人在线视频| 日本不卡一二三区| 色又黄又爽网站www久久| 欧美撒尿777hd撒尿| 4438亚洲最大| 久久久久久久久伊人| 中文字幕在线不卡| 天堂蜜桃一区二区三区| 国产精品白丝jk黑袜喷水| 9人人澡人人爽人人精品| 国产亚洲精品美女久久久m| 日本高清视频一区二区三区| 日本精品裸体写真集在线观看| 欧美一区二视频| 中文字幕日韩一区| 麻豆国产欧美一区二区三区| 成人高清视频免费观看| 鲁鲁狠狠狠7777一区二区| 色妞www精品视频| 久久免费的精品国产v∧| 一区二区久久久久久| 国内精品嫩模私拍在线| 成人看片在线| 一本高清dvd不卡在线观看| 精品免费一区二区三区| 一区二区三区四区在线| 国产一本一道久久香蕉| 韩国一区二区三区美女美女秀| 制服诱惑一区| 国产女同互慰高潮91漫画| 日韩av中文在线观看| 91视频在线看| 日本久久精品电影| 国产精品全国免费观看高清| 欧美aaaaa成人免费观看视频| 91久久极品少妇xxxxⅹ软件| 亚洲欧洲日韩精品| 精品国产一区二区三区久久久蜜月 | 一道本成人在线| 久久综合色鬼综合色| 午夜精品一区二区三区电影天堂 | 欧美性大战xxxxx久久久| 国产亚洲成年网址在线观看| 日本aⅴ免费视频一区二区三区| 97伦理在线四区| 欧美精三区欧美精三区| 亚洲综合一区二区精品导航| av电影天堂一区二区在线| 91久久国产最好的精华液| 中文字幕不卡在线观看| 国产精品一级黄| 一区不卡视频| 成人免费在线视频观看| 成人精品免费网站| 中文字幕欧美日韩一区二区| 国产精品久久久久久久久动漫| 国产成人av一区二区三区在线 | 99免费在线视频观看| 欧美揉bbbbb揉bbbbb| 亚洲国产精品久久久久秋霞影院| 翡翠波斯猫1977年美国| 69堂亚洲精品首页| 日本不卡一区二区三区 | 欧美色图天堂网| 亚洲丰满少妇videoshd| 国产一区二区三区黄| 337p粉嫩大胆噜噜噜噜噜91av| 黄页网站大全一区二区| 色综合久久99| 午夜在线成人av| 蜜桃网站成人| 中文字幕一区免费在线观看| 成人动漫精品一区二区| 91精品国产欧美一区二区18| 美女一区二区三区| 中文字幕在线观看一区二区三区| 一区二区三区蜜桃网| 国产三区精品| 国产精品乱人伦中文| 成人自拍网站| 欧美激情自拍偷拍| 动漫精品视频| 国产精品免费视频一区| 99理论电影网| 亚洲国产精品精华液2区45| av成人免费观看| 中文字幕乱码亚洲精品一区| 91在线视频在线| 国产欧美一区二区在线观看| 成人3d动漫一区二区三区91| 欧美激情一区二区三区蜜桃视频| 波多野结衣久草一区| 中文字幕制服丝袜成人av| 久久影视中文粉嫩av| 亚洲综合一区二区精品导航| 亚洲国产成人不卡| 香蕉成人伊视频在线观看| 色悠悠久久综合| 国产一区91精品张津瑜| 日韩亚洲欧美高清| 91污片在线观看| 1000精品久久久久久久久| 欧美精彩一区二区三区| 午夜一区二区三区视频| 欧美四级电影在线观看| 高潮精品一区videoshd| 久久久久88色偷偷免费| 久久久久久亚洲精品不卡4k岛国 | 蜜臀av一级做a爰片久久| 欧美日韩一区视频| 成人免费视频国产在线观看| 日本一区二区久久| 欧美日韩精品一区| 人人爽香蕉精品| 欧美一级日韩一级| 国产精品果冻传媒潘| 亚洲午夜在线观看视频在线| 欧美日韩亚洲丝袜制服| 99久久久精品免费观看国产蜜| 国产精品国产自产拍在线| 日本一区二区在线视频观看| 日韩精品高清不卡| 欧美一区二区三区视频免费| 91麻豆视频网站| 亚洲自拍偷拍图区| 欧美精品乱人伦久久久久久| 国产精成人品localhost| 亚洲国产精品综合小说图片区| 欧美日韩亚洲丝袜制服| 5g国产欧美日韩视频| 一区二区三区四区国产精品| 欧美日韩亚洲丝袜制服| 粉嫩精品一区二区三区在线观看 | 风间由美一区二区三区在线观看| 国产女人18毛片水真多成人如厕 | 亚洲国产精品一区二区第一页| 久久超碰97中文字幕| 久久精品无码一区二区三区| 亚欧洲精品在线视频免费观看| 国产毛片精品一区| 国产欧美韩日| 美女尤物国产一区| 日本一区二区免费在线观看视频 | av激情久久| 日本不卡一二三区黄网| 久久久久久久网| 在线免费观看不卡av| 成人永久免费| 国内精品视频一区二区三区八戒| 日韩一区欧美一区| 7777精品伊人久久久大香线蕉经典版下载 | 麻豆91av| 成人教育av在线| 亚洲成人综合网站| 久久久国产一区二区三区四区小说| 色香蕉成人二区免费| 国产在线精品一区| 懂色av一区二区三区蜜臀| 一区二区三区日韩欧美| 精品国产免费人成在线观看| 一本色道久久99精品综合| 岛国视频一区| 国产福利一区二区三区| 日日摸夜夜添夜夜添亚洲女人| 中文字幕不卡在线| 91精品久久久久久久久99蜜臂| 视频一区视频二区视频三区高| 成人美女视频在线观看18| 日韩高清不卡在线| 亚洲图片激情小说| 精品国产三级a在线观看| 精品视频123区在线观看| 日韩欧美在线电影| 成人黄动漫网站免费| 成人深夜福利app| 蜜桃久久久久久| 亚洲综合久久久| 亚洲天堂网中文字| 国产片一区二区三区| 日韩欧美久久久| 精品视频1区2区| 色激情天天射综合网| 天堂精品视频| 欧美韩国日本精品一区二区三区| 国产精品久久波多野结衣| 91蝌蚪porny成人天涯| 国产一区二区三区在线观看精品| 日韩高清在线不卡|