作家
登录

Linux设备驱动中的并发控制

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

 
  •     schedule(); //调剂其他过程履行 
  •     if (signal_pending(current))    //如不雅是因为旌旗灯号唤醒    { 
  •       ret =  - ERESTARTSYS;      goto out2; 
  •     } 
  •  
  •     down(&dev->sem); //获得旌旗灯号量  }  /*大年夜用户空间拷贝到内核空间*/ 
  •   if (count > GLOBALFIFO_SIZE - dev->current_len) 
  •     count = GLOBALFIFO_SIZE - dev->current_len;  if (copy_from_user(dev->mem + dev->current_len, buf, count)) 
  •   { 
  •     ret =  - EFAULT;    goto out
  •   }  else 
  •   { 
  •     dev->current_len += count
  •     printk(KERN_INFO "written %d bytes(s),current_len:%d\n"count, dev      ->current_len); 
  •  
  •     wake_up_interruptible(&dev->r_wait); //唤醒读等待队列     
  •     ret = count
  •   } 
  •  
  •  
  • tasklet_schedule(&dev->tlet); 
  • printk("in write jiffies=%ld\n",jiffies);  out: up(&dev->sem); //释放旌旗灯号量 
  •   out2:remove_wait_queue(&dev->w_wait, &wait); //大年夜从属的等待队列头移除  set_current_state(TASK_RUNNING);  return ret; 
  • }/*文件操作构造体*/static const struct file_operations globalfifo_fops ={ 
  •   .owner = THIS_MODULE, 
  •   .read = globalfifo_read, 
  •   .write = globalfifo_write, 
  •   .ioctl = globalfifo_ioctl, 
  •   .poll = globalfifo_poll, 
  •   .open = globalfifo_open, 
  •   .release = globalfifo_release, 
  • };/*初始化并注册cdev*/static void globalfifo_setup_cdev(struct globalfifo_dev *dev, int index
  • {  int err, devno = MKDEV(globalfifo_major, index); 
  •  
  •   cdev_init(&dev->cdev, &globalfifo_fops); 
  •   dev->cdev.owner = THIS_MODULE; 
  •   dev->cdev.ops = &globalfifo_fops; 
  •   err = cdev_add(&dev->cdev, devno, 1);  if (err) 
  •     printk(KERN_NOTICE 

      推荐阅读

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

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


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

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

  • 关键词: 探索发现

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

    网友点评
    自媒体专栏

    评论

    热度

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