久久精品在这里_成人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欧美一区二区三区
国产欧美日韩不卡免费| 欧美一区二区三区四区高清| 999热视频| av免费观看久久| 国产一级二级三级精品| 乱一区二区三区在线播放| 日韩免费电影一区二区三区| 一区二区三区四区五区视频| 欧美挠脚心视频网站| 日韩精品一区二区三区视频在线观看 | 欧美精品久久久久久久多人混战| 日韩一二三区视频| 欧美韩国日本综合| 五月天久久比比资源色| 国产精品18久久久久久久久| 成人免费在线一区二区三区| 婷婷四月色综合| 欧美高清精品3d| 国产精品麻豆欧美日韩ww| 午夜久久久久久| 97se亚洲国产综合自在线不卡 | 91麻豆福利精品推荐| 久久久久国产精品视频| 在线观看一区二区视频| 久久久国产一区二区三区四区小说 | 四虎永久国产精品| 91精品国产色综合久久 | 久久精品噜噜噜成人av农村| 91在线国产福利| 亚洲国产欧美一区二区三区不卡| 日韩欧美国产系列| 亚洲综合久久久久| av激情综合网| 色综合欧美在线| 国产欧美精品国产国产专区| 蜜桃传媒麻豆第一区在线观看| 91丨porny丨首页| 色诱亚洲精品久久久久久| 久久久久免费观看| 蜜臀国产一区二区三区在线播放| 国产乱码精品一区二区三区卡| 色香蕉成人二区免费| 国产精品天干天干在观线| 国产在线视频一区二区三区| 日本一区二区三区www| 2023国产精品自拍| 久久精品99国产精品| 日韩电影免费观看高清完整| 久久综合资源网| 精品在线观看视频| 色综合电影网| 成人免费在线视频观看| 成人性视频免费网站| 色综合中文字幕| 999国产在线| 91久久免费观看| 国产精品国产自产拍在线| 国产精品1区2区3区在线观看| 亚洲欧美日产图| 国产精品美女久久久久av爽李琼| 国产主播一区二区| 亚洲欧美日韩不卡一区二区三区| 中文字幕va一区二区三区| 国产凹凸在线观看一区二区| 亚洲一区美女| 一区二区免费在线| 精品亚洲国内自在自线福利| 欧美日韩在线播放一区二区| 久久品道一品道久久精品| 国产老肥熟一区二区三区| 亚洲一区不卡在线| 一二三区精品视频| 久久精品午夜一区二区福利| 国产女人18毛片水真多成人如厕| 国产成人在线免费观看| 精品婷婷伊人一区三区三| 日韩电影在线一区二区三区| 日本高清一区| 一片黄亚洲嫩模| 麻豆av一区二区三区久久| 欧美高清在线一区| 粉嫩av免费一区二区三区| 国产午夜三级一区二区三| 99精品视频在线播放观看| 日韩小视频在线观看专区| 国产露脸91国语对白| 91精品国产综合久久久久久久 | 亚洲一区二区三区视频在线| 国产视频精品网| 亚洲国产高清不卡| 国产高清在线一区| 国产精品视频观看| 久久99精品国产一区二区三区| 国产欧美精品在线观看| 国产精品入口免费| 国产精品久久久久久一区二区三区 | 亚洲激情一区二区| 午夜激情一区二区| 色婷婷狠狠综合| 五月激情综合婷婷| 在线观看精品一区| 激情av综合网| 精品国产99国产精品| 91麻豆国产精品久久| 国产精品免费视频一区| 免费中文日韩| 五月婷婷激情综合| 欧美日本乱大交xxxxx| 成人黄色大片在线观看| 国产日韩欧美综合在线| 精品国产一区二区三区麻豆小说 | 精品日韩一区二区三区免费视频| 99这里都是精品| 欧美韩日一区二区三区| 美女主播视频一区| 奇米777欧美一区二区| 国产综合第一页| 一区二区日韩电影| 欧美在线看片a免费观看| 成人毛片老司机大片| 国产精品水嫩水嫩| 色综合天天做天天爱| 国产精品69久久久久水密桃| 久久久精品蜜桃| 日韩精品久久一区| 国产精品乡下勾搭老头1| 国产亚洲综合在线| 日韩在线电影一区| 高清久久久久久| 亚洲免费毛片网站| 欧美精品aⅴ在线视频| 国产一区二区中文字幕免费看| 视频一区欧美精品| 欧美成人猛片aaaaaaa| 欧美裸体网站| 国产寡妇亲子伦一区二区| 国产精品久久久久天堂| 欧美午夜宅男影院| 国产66精品久久久久999小说| 天堂午夜影视日韩欧美一区二区| 精品乱码亚洲一区二区不卡| 清纯唯美一区二区三区| 成人一区在线观看| 亚洲一线二线三线久久久| 欧美一区二区免费| 日本电影一区二区三区| 成人免费精品视频| 亚洲国产视频一区二区| 欧美精品一区在线观看| 亚洲欧美日韩精品综合在线观看 | 亚洲激情电影在线| 成人97人人超碰人人99| 性欧美大战久久久久久久久| 精品电影一区二区| 色屁屁一区二区| 好吊色欧美一区二区三区四区| 黄色小说综合网站| 一区二区三区精品在线| 久久日韩精品一区二区五区| 在线欧美一区二区| 蜜桃av色综合| 7777精品久久久大香线蕉小说| 久久国产麻豆精品| 亚洲黄色小视频| 欧美国产一区在线| 91精品国产综合久久久久久漫画| 婷婷久久伊人| 精品国产综合| 97久久久精品综合88久久| 蓝色福利精品导航| 亚洲自拍偷拍九九九| 中文字幕精品一区二区三区精品| 这里是久久伊人| 在线中文字幕一区| 日本在线免费观看一区| 国产精品久久精品国产| 成人精品视频.| 国产一区二区三区免费在线观看| 性感美女久久精品| 亚洲精品成人天堂一二三| 国产日韩视频一区二区三区| 欧美一级免费观看| 色婷婷av一区二区| 亚洲精品久久区二区三区蜜桃臀 | 91麻豆swag| jlzzjlzz亚洲日本少妇| 国产在线精品免费| 蜜桃91丨九色丨蝌蚪91桃色| 午夜精品福利一区二区蜜股av | 日韩精品一区二区三区丰满 | 亚洲三区在线观看| 欧美日韩综合网| 牛人盗摄一区二区三区视频| 国内一区在线| 久久国产手机看片| 美女被啪啪一区二区| 欧美不卡1区2区3区| 欧美不卡在线一区二区三区| 国产在线一区二区三区四区| 国产伦理一区二区三区|