- 论坛徽章:
- 0
|
本帖最后由 cambyzju 于 2010-07-30 11:24 编辑
那象ldd3这种是不是设计上的问题??
因为如果唤醒的话,它又会马上进入睡眠状态。。。
只能用信号强制中断,这样是不是太暴力了点??- static ssize_t scull_p_read (struct file *filp, char __user *buf, size_t count,loff_t *f_pos)
- {
- struct scull_pipe *dev = filp->private_data;
- if (down_interruptible(&dev->sem))
- return -ERESTARTSYS;
复制代码- while (dev->rp = = dev->wp) { /* nothing to read */
- up(&dev->sem); /* release the lock */
- if (filp->f_flags & O_NONBLOCK)
- return -EAGAIN;
- PDEBUG("\"%s\" reading: going to sleep\n", current->comm);
- if (wait_event_interruptible(dev->inq, (dev->rp != dev->wp)))
- return -ERESTARTSYS; /* signal: tell the fs layer to handle it */
- /* otherwise loop, but first reacquire the lock */
- if (down_interruptible(&dev->sem))
- return -ERESTARTSYS;
- }
复制代码
- /* ok, data is there, return something */
- if (dev->wp > dev->rp)
- count = min(count, (size_t)(dev->wp - dev->rp));
- else /* the write pointer has wrapped, return data up to dev->end */
- count = min(count, (size_t)(dev->end - dev->rp));
- if (copy_to_user(buf, dev->rp, count)) {
- up (&dev->sem);
- return -EFAULT;
- }
- dev->rp += count;
- if (dev->rp = = dev->end)
- dev->rp = dev->buffer; /* wrapped */
- up (&dev->sem);
- /* finally, awake any writers and return */
- wake_up_interruptible(&dev->outq);
- PDEBUG("\"%s\" did read %li bytes\n",current->comm, (long)count);
- return count;
- }
- [color=DarkOrange][color=Black][/color][/color]
复制代码 |
|