作家
登录

Linux设备驱动中的并发控制

作者: 来源: 2017-11-07 09:07:06 阅读 我要评论

  •  
  •   switch (cmd) 
  •   {    case FIFO_CLEAR: 
  •      down(&dev->sem); //获得旌旗灯号量      
  •       dev->current_len = 0; 
  •       memset(dev->mem,0,GLOBALFIFO_SIZE); 
  •       up(&dev->sem); //释放旌旗灯号量          
  •       printk(KERN_INFO "globalfifo is set to zero\n");       
  •       break;    default:      return  - EINVAL; 
  •   }  return 0; 
  • }static unsigned int globalfifo_poll(struct file *filp, poll_table *wait) 
  •   unsigned int mask = 0;  struct globalfifo_dev *dev = filp->private_data; /*获得设备构造体指针*/ 
  •    
  •   down(&dev->sem); 
  •    
  •   poll_wait(filp, &dev->r_wait, wait); 
  •   poll_wait(filp, &dev->w_wait, wait);   
  •   /*fifo非空*/ 
  •   if (dev->current_len != 0) 
  •   { 
  •     mask |= POLLIN | POLLRDNORM; /*标示数据可获得*/ 
  •   }  /*fifo非满*/ 
  •   if (dev->current_len != GLOBALFIFO_SIZE) 
  •   { 
  •     mask |= POLLOUT | POLLWRNORM; /*标示数据可写入*/ 
  •   } 
  •       
  •   up(&dev->sem);  return mask; 
  • }/*globalfifo读函数*/static ssize_t globalfifo_read(struct file *filp, char __user *buf, size_t count
  •   loff_t *ppos) 
  • {  int ret;  struct globalfifo_dev *dev = filp->private_data; //获得设备构造体指针 
  •   DECLARE_WAITQUEUE(wait, current); //定义等待队列 
  •   down(&dev->sem); //获得旌旗灯号量 
  •   add_wait_queue(&dev->r_wait, &wait); //进入读等待队列头 
  •  
  •   /* 等待FIFO非空 */ 
  •   if (dev->current_len == 0) 
  •   {    if (filp->f_flags &O_NONBLOCK) 
  •     { 
  •       ret =  - EAGAIN;      goto out
  •     }  
  •     __set_current_state(TASK_INTERRUPTIBLE); //改变过程状况为睡眠 
  •     up(&dev->sem); 

      推荐阅读

      看看60万码农怎么评论:这世界上还有没有月薪低于3万的程序员?

    IT界一位大年夜神早已下过定论:“对于那些月薪三万以下,自称法度榜样员的码农们,其实我们大年夜来没有把他们归为我们法度榜样员的部队。他们固然老是以法度榜样员自居,但只是他们>>>详细阅读


    本文标题:Linux设备驱动中的并发控制

    地址:http://www.17bianji.com/lsqh/38523.html

  • 关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)