免费注册 查看新帖 |

Chinaunix

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

增加等待队列后的 globalfifo 读写函数的不解???? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-13 15:41 |只看该作者 |倒序浏览
大牛们,我怎么感觉第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;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP