免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1569 | 回复: 2
打印 上一主题 下一主题

弱问关于等待队列?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-29 23:49 |只看该作者 |倒序浏览
驱动里使用了等待队列~~

但是如果驱动退出时,等待队列里还有进程
这些进程该怎么妥善处理??直接不管么?
因为他们等待的资源已经不存在了

论坛徽章:
0
2 [报告]
发表于 2010-07-30 09:43 |只看该作者
应该是:
1. 唤醒队列里的所有睡眠进程
2. 再退出驱动

论坛徽章:
0
3 [报告]
发表于 2010-07-30 11:23 |只看该作者
本帖最后由 cambyzju 于 2010-07-30 11:24 编辑

那象ldd3这种是不是设计上的问题??
因为如果唤醒的话,它又会马上进入睡眠状态。。。

只能用信号强制中断,这样是不是太暴力了点??
  1. static ssize_t scull_p_read (struct file *filp, char __user *buf, size_t count,loff_t *f_pos)
  2. {
  3.     struct scull_pipe *dev = filp->private_data;
  4.     if (down_interruptible(&dev->sem))
  5.         return -ERESTARTSYS;
复制代码
  1.     while (dev->rp = = dev->wp) { /* nothing to read */
  2.         up(&dev->sem); /* release the lock */
  3.         if (filp->f_flags & O_NONBLOCK)
  4.             return -EAGAIN;
  5.         PDEBUG("\"%s\" reading: going to sleep\n", current->comm);
  6.         if (wait_event_interruptible(dev->inq, (dev->rp != dev->wp)))
  7.             return -ERESTARTSYS; /* signal: tell the fs layer to handle it */
  8.         /* otherwise loop, but first reacquire the lock */
  9.         if (down_interruptible(&dev->sem))
  10.             return -ERESTARTSYS;
  11.     }
复制代码

  1.     /* ok, data is there, return something */
  2.   if (dev->wp > dev->rp)
  3.       count = min(count, (size_t)(dev->wp - dev->rp));
  4.   else /* the write pointer has wrapped, return data up to dev->end */
  5.       count = min(count, (size_t)(dev->end - dev->rp));
  6.   if (copy_to_user(buf, dev->rp, count)) {
  7.       up (&dev->sem);
  8.       return -EFAULT;
  9.   }
  10.   dev->rp += count;
  11.   if (dev->rp = = dev->end)
  12.       dev->rp = dev->buffer; /* wrapped */
  13.   up (&dev->sem);
  14.   /* finally, awake any writers and return */
  15.   wake_up_interruptible(&dev->outq);
  16.   PDEBUG("\"%s\" did read %li bytes\n",current->comm, (long)count);
  17.   return count;
  18. }
  19. [color=DarkOrange][color=Black][/color][/color]
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP