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


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


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

主題:深入淺出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免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
国产亚洲精品资源在线26u| 欧美亚洲动漫制服丝袜| 成人动漫av在线| 国产精品综合在线视频| 国产一区二区导航在线播放| 久久99精品国产麻豆婷婷| 另类成人小视频在线| 美女网站一区二区| 国产乱理伦片在线观看夜一区 | 琪琪一区二区三区| 精品一区二区三区的国产在线播放| 久久av中文字幕片| 国产91精品欧美| 91久久伊人青青碰碰婷婷| 精品一区久久久| 亚洲国产一区二区三区在线播| 色婷婷综合五月| 日韩欧美视频一区| 亚洲欧美自拍偷拍| 日本中文在线一区| 成人中文字幕合集| 久久综合狠狠综合久久综青草| 国产精品高潮呻吟| 亚洲欧美在线视频观看| 日本伊人色综合网| 9l国产精品久久久久麻豆| 精品无码久久久久久久动漫| 在线丝袜欧美日韩制服| 精品国产乱码久久久久久夜甘婷婷| 中文字幕一区二区三区在线不卡 | 大尺度一区二区| 就去色蜜桃综合| 欧美日韩在线综合| 中文字幕欧美区| 日韩国产精品91| 99在线视频播放| 91国产免费观看| 国产欧美精品日韩区二区麻豆天美| 亚洲国产精品一区二区久久| 成人av一区二区三区| 欧美日韩最好看的视频| 91精品国产一区二区三区香蕉| 亚洲女与黑人做爰| 成人激情av网| 影音先锋欧美资源| 亚洲国产精品ⅴa在线观看| 蜜桃视频在线观看一区| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 久久精品国产久精国产| 国产成人免费观看| 欧美三级午夜理伦三级中视频| 国产婷婷色一区二区三区| 日本女人一区二区三区| 国产一区二区黄色| 日韩一区二区在线观看| 亚洲福利一区二区| 国产日产精品一区二区三区四区| 欧美三级资源在线| 亚洲曰韩产成在线| 古典武侠综合av第一页| 6080国产精品一区二区| 亚洲一区二区三区四区中文字幕| 99久久精品免费| 欧美另类久久久品| 日韩精彩视频在线观看| 麻豆av福利av久久av| 久久综合久久99| 国产一二精品视频| 欧美性videosxxxxx| 亚洲四区在线观看| av一本久道久久波多野结衣| 欧美一区二区在线不卡| 麻豆91精品视频| 最近看过的日韩成人| 亚洲一区二三区| 狼狼综合久久久久综合网| 中文字幕二三区不卡| 97se狠狠狠综合亚洲狠狠| 国产毛片一区二区| 在线观看成人av| 亚洲免费色视频| 懂色一区二区三区av片| 精品卡一卡二卡三卡四在线| 国产精品亚洲视频| 欧美精品自拍偷拍动漫精品| 久久精品99国产精品日本| 亚洲一区精彩视频| 亚洲综合激情网| 欧美日韩在线高清| 亚洲少妇中出一区| 久久99精品久久久久久秒播放器| 亚洲国产精品99久久久久久久久| 91久久国产综合久久蜜月精品| 久久亚洲捆绑美女| 99国产超薄丝袜足j在线观看| 久久一二三国产| 91小视频在线免费看| 久久久久久电影| 91年精品国产| 国产精品天干天干在线综合| 福利视频一区二区三区| 国产精品国产三级国产a| 国产综合av一区二区三区| 中文字幕一区二区三区不卡在线| 久久99精品国产一区二区三区| 亚洲免费观看高清完整版在线 | 国产aⅴ精品一区二区三区色成熟| 日本韩国一区二区三区视频| 日韩激情视频网站| 色狠狠一区二区| 精品无人码麻豆乱码1区2区| 在线播放91灌醉迷j高跟美女| 国产成人av一区| 欧美videos大乳护士334| 91日韩久久| 亚洲日本va在线观看| 日本高清一区| 视频一区中文字幕国产| 欧美无人高清视频在线观看| 国产精品1区2区3区| 精品噜噜噜噜久久久久久久久试看| 91蜜桃免费观看视频| 国产精品国产三级国产专播品爱网| 精品一区二区三区免费毛片| 亚洲国产视频网站| 欧美日韩精品一区二区三区| 顶级嫩模精品视频在线看| 久久久久久亚洲综合影院红桃| 99re视频在线观看| 夜色激情一区二区| 欧美日韩情趣电影| www.成人三级视频| 亚洲五码中文字幕| 3atv在线一区二区三区| 99视频在线| 午夜影视日本亚洲欧洲精品| 欧美精品v日韩精品v韩国精品v| www.亚洲在线| 亚洲午夜一区二区三区| 欧美日韩午夜精品| 国产精品.com| 蜜桃91丨九色丨蝌蚪91桃色| 97超级碰碰| 一区二区三区中文字幕| 欧美日韩国产中文| 国产在线资源一区| 国内外成人在线| 18欧美亚洲精品| 欧美久久久久久蜜桃| 国产区二精品视| 久久av中文字幕片| 国产精品女同一区二区三区| 欧美亚洲日本一区| 大波视频国产精品久久| 奇米一区二区三区av| 久久综合网色—综合色88| 亚洲欧洲一区二区福利| 99久久久免费精品国产一区二区| 亚洲午夜三级在线| 精品国产三级电影在线观看| 一区二区精品国产| av一区观看| 韩国成人福利片在线播放| 国产精品美女久久久久av爽李琼| 一本大道综合伊人精品热热| 国产欧美日韩一区| 国产成人在线色| 亚洲自拍与偷拍| 国产欧美一区二区三区在线看蜜臀| 色婷婷久久久久swag精品| 91理论电影在线观看| 美女精品自拍一二三四| 亚洲视频一区在线| 精品乱人伦小说| 91福利在线导航| 久久av一区二区三区漫画| 成人免费视频视频| 日本在线不卡视频一二三区| 国产精品三级视频| 精品国产乱码久久久久久久久 | 久久国产精品第一页| 国产日韩精品推荐| 国产高清无密码一区二区三区| 亚洲福利视频一区| 中文字幕亚洲电影| 久久综合色8888| 欧美一区二区三区在线| 91国在线观看| 亚洲国产午夜伦理片大全在线观看网站 | 日韩一区二区三区精品视频 | 亚洲国产成人一区二区三区| 91精品国产欧美一区二区成人| 一区二区三区的久久的视频| 久久成人资源| 成人午夜电影在线播放| 成人免费看片app下载| 国产精华液一区二区三区| 看片的网站亚洲| 日本少妇一区二区| 石原莉奈在线亚洲三区|