国语自产精品视频在线看:您身边最放心的安全下载站! 最新软件|热门排行|软件分类|软件专题|厂商大全

国语自产精品视频在线看

技术教程
您的位置:首页操作系统linux → 详解Linux设备驱动中的阻塞与非阻塞

详解Linux设备驱动中的阻塞与非阻塞

我要评论 2011/09/28 12:21:19 来源:国语自产精品视频在线看 编辑:downcc.com [ ] 评论:0 点击:196次

  「阻塞与非阻塞✡定义」阻塞操作是指【zuò shì zhǐ】,在执行【zài zhí háng】🐏设备操【shè bèi cāo】作时【zuò shí】,若不能【ruò bú néng】获得资🎾源【yuán】,则进程【chéng】🛒挂起🕡直到满😔足【zú】可操作的【cāo zuò de】🔼条件再【tiáo jiàn zài】进行操作【zuò】。被挂起【bèi guà qǐ】🕡的进程【de jìn chéng】进入【rù】😵sleep 状态【tài】🍠,被从调【bèi cóng diào】度器的🧤运行队【yùn háng duì】列移走,直到等待的条【dài de tiáo】件【jiàn】被满👹足【zú】。

  非阻塞✡操作的【cāo zuò de】🔼进程【chéng】在不能进行设备👬操作时【zuò shí】,并不挂【bìng bú guà】起🕡。

  「阻塞实例」

  多个【gè】进程【chéng】🌹对驱动【duì qū dòng】中的全【zhōng de quán】局变量【jú biàn liàng】,有的读有的写,用阻塞机制来保证只有在某📇个【gè】进程【chéng】🌹写过之后,其他进【qí tā jìn】程【chéng】在能😵够读这🎑个变量【gè biàn liàng】。

  #include #include #include #include #include #include

  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 wait_queue_head_t outq;//定义等【dìng yì děng】〽待队列【duì liè】🙈头static int flag = 0;//阻塞条【zǔ sāi tiáo】🧙件【jiàn】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);init_waitqueue_head(&outq);} 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 (wait_event_interruptible(outq, flag != 0))//在这里🐡让调用🔓自己的【zì jǐ de】🎇进程【chéng】进入【rù】😵挂起状🔱态【tài】🍠,直到满😔/ //足【zú】后面🆕的条件【de tiáo jiàn】才脱离挂起状🔱态【tài】🍠{ return - ERESTARTSYS;} if (down_interruptible(&sem))

  { return - ERESTARTSYS;} flag = 0; //阻塞条【zǔ sāi tiáo】🧙件【jiàn】在这🧜里发生【lǐ fā shēng】改变🎱,意味着【yì wèi zhe】🍢每次只🎢能对这个变量【gè biàn liàng】读一次,除非再次给这🥊个【gè】//变量赋了新值【le xīn zhí】🏗。

  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);flag = 1;//阻塞条【zǔ sāi tiáo】🧙件【jiàn】在这🧜里发生【lǐ fā shēng】改变🎱,意味着【yì wèi zhe】🍢可以挂【kě yǐ guà】起🕡的进程【de jìn chéng】可以解【kě yǐ jiě】禁了【le】📙/*通知数据可获得前面调用驱🦌动read函数的【hán shù de】🦎进程被【jìn chéng bèi】调整到【diào zhěng dào】🌵了【le】📆挂起状🔱态【tài】🍠,只有当满足【zú】一个条件【gè tiáo jiàn】的时候【de shí hòu】🧕才会从⏪挂起状🔱态【tài】🍠摆脱【bǎi tuō】。这个【gè】地🍩方注意了【le】📆,并没有【bìng méi yǒu】一个【gè】机🦒制自动的检测【de jiǎn cè】🖤条件【jiàn】,或者条件【jiàn】改变🎱的时候【de shí hòu】🧕,自动通🌦知内核【zhī nèi hé】改变🎱进程的【jìn chéng de】状态【tài】🍠。而是【ér shì】,我们需要调用函数去手动唤⛪醒等待🔢队列【duì liè】,队列【duì liè】会检测条【jiǎn cè tiáo】件【jiàn】,如果条➰件【jiàn】满足【zú】🍫,那么解禁进程【jìn jìn chéng】,如果条➰件【jiàn】不满足【zú】,进程【chéng】依🚝然被封印🍍。

  */ wake_up_interruptible(&outq);return sizeof(int);} module_init(globalvar_init);module_exit(globalvar_exit);

  这里有一个【gè】问题👫,等待队列【duì liè】🙈应该可能会有多个【gè】被封印🍍的进程【de jìn chéng】,在这种【zài zhè zhǒng】情况下【qíng kuàng xià】:1. 后面的【hòu miàn de】进🙉程【chéng】能否被前面的进🙉程【chéng】更早的解禁?

  2. 每次通📙过函数试图唤醒队列【duì liè】的时候【de shí hòu】🧕,队列【duì liè】对条件【jiàn】的检测【de jiǎn cè】🖤机制是怎样的?是否一个【gè】一个【gè】的进程【de jìn chéng】顺序的😡检测【jiǎn cè】各自的条【zì de tiáo】🍚件【jiàn】吗?

  用来对【yòng lái duì】本驱动【běn qū dòng】🚾进行测【jìn háng cè】试的参考应用🚋程序为【chéng xù wéi】:「读程序【dú chéng xù】」

  #include #include #include #include main()

  { int fd, num;fd = open("/dev/globalvar", O_RDWR, S_IRUSR | S_IWUSR);if (fd != - 1)

  { while (1)

  { read(fd, &num, sizeof(int)); //程【chéng】序将阻塞在此语句,除非有🕕针对globalvar 的输入【rù】😭printf("The globalvar is %d\n", num);//如果输【rú guǒ shū】入【rù】😵是0,则退出【tuì chū】if (num == 0)

  { close(fd);break;} else { printf("device open failure\n");}

  「写程【chéng】序📺」

  #include #include #include #include main()

  { int fd, num;fd = open("/dev/globalvar", O_RDWR, S_IRUSR | S_IWUSR);if (fd != - 1)

  { while (1)

  { printf("Please input the globalvar:\n");scanf("%d", &num);write(fd, &num, sizeof(int));//如果输【rú guǒ shū】入【rù】😵0,退出【tuì chū】if (num == 0)

  { close(fd);break;} else { printf("device open failure\n");}

关键词:Linux,设备驱动

阅读本文后您有什么感想? 已有 人给出评价!

  • 1 欢迎喜欢
  • 1 白痴
  • 1 拜托
  • 1 哇
  • 1 加油
  • 1 鄙视