- 论坛徽章:
- 0
|
大牛们,我怎么感觉第31行的函数永远不会执行啊????
/*globalfifo 读函数*/
2 static ssize_t globalfifo_read(struct file *filp, char _ _user *buf, size_t count, loff_t *ppos)
4 {
5 int ret;
6 struct globalfifo_dev *dev = filp->private_data; //获得设备结构体指针
7 DECLARE_WAITQUEUE(wait, current); //定义等待队列
8
down(&dev->sem); //获得信号量
10 add_wait_queue(&dev->r_wait, &wait); //进入读等待队列头
11
12 /* 等待 FIFO 非空 */
13 if (dev->current_len == 0)
14 {
15 if (filp->f_flags &O_NONBLOCK)
16 {
17 ret= - EAGAIN;
18 goto out;
19 }
20 _ _set_current_state(TASK_INTERRUPTIBLE); //改变进程状态为睡眠
21 up(&dev->sem);
22
23 schedule(); //调度其他进程执行
24
if (signal_pending(current))
25 //如果是因为信号**
26 {
27 ret= - ERESTARTSYS;
28 goto out2;
29 }
30
31 down(&dev->sem);
32 }
33
34 /* 复制到用户空间 */
35 if (count > dev->current_len)
36 count = dev->current_len;
37
38 if (copy_to_user(buf, dev->mem, count))
39 {
40 ret= - EFAULT;
41 goto out;
42 }
43 else
44 {
45 memcpy(dev->mem, dev->mem + count, dev->current_len - count);
//fifo 数据前移
46 dev->current_len -= count; //有效数据长度减少
47 printk(KERN_INFO "read %d bytes(s),current_len:%d\n", count,
dev
48 ->current_len);
49
50 wake_up_interruptible(&dev->w_wait); //**写等待队列
51
52 ret = count;
53 }
54 out: up(&dev->sem); //释放信号量
55 out2: remove_wait_queue(&dev->w_wait, &wait); //从附属的等待队列
头移除
56 set_current_state(TASK_RUNNING);
57 return ret; |
|