Linux设备驱动开发详解一书,阻塞I/O是否出现信号量死锁情况?

Nick_ctrl 2017-08-30 04:35:33
在该书阻塞与非阻塞I/O章节中,P168页代码8.9中,read函数和write函数在做完往缓冲读写数据后,并没有up信号量的操作,这里是怎么理解的?代码如下,84行,谢谢!
46 /*globalfifo读函数*/
47 static ssize_t globalfifo_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
48 {
49 int ret;
50 struct globalfifo_dev *dev = filp->private_data;
51 DECLARE_WAITQUEUE(wait, current);
52
53 down(&dev->sem); /*获得信号量*/
54 add_wait_queue(&dev->r_wait, &wait); /*加入读等待队列头 到内核*/
55
56 /*等待FIFO 非空*/
57 if(dev->current_len == 0){
58 if(filp->f_flags & O_NONBLOCK){ /*如果进程为 非阻塞打开 设备文件*/
59 ret = -EAGAIN;
60 goto out;
61 }
62 __set_current_state(TASK_INTERRUPTIBLE); /*改变进程状态为睡眠*/
63 up(&dev->sem); /*释放信号量*/
64
65 schedule(); /*调度其他进程执行*/
66 if(signal_pending(current)){
67 /*如果是因为信号唤醒*/
68 ret = -ERESTARTSYS;
69 goto out2;
70 }
71 down(&dev->sem);
72 }
73
74 /*拷贝到用户空间*/
75 if(count > dev->current_len)
76 count = dev->current_len;
77 if(copy_to_user(buf, dev->mem, count)){
78 ret = -EFAULT;
79 goto out;
80 }else{
81 memcpy(dev->mem, dev->mem + count, dev->current_len - count);/*数据前移*/
82 dev->current_len -= count; /*有效数据长度减少*/
83 printk(KERN_INFO"read %d bytes(s),current_len:%d\n",count, dev->current_len);
84 //此处为什么不需要 up(&dev->sem); ?
85 wake_up_interruptible(&dev->w_wait); /*唤醒写等待队列*/
86 ret = count;
87 }
88 out:
89 up(&dev->sem); /*释放信号量*/
90 out2:
91 remove_wait_queue(&dev->w_wait, &wait); /*从属的等待队列头移除*/
92 set_current_state(TASK_RUNNING);
93 return ret;
94 }
...全文
660 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
byeyear 2017-09-08
  • 打赏
  • 举报
回复
引用 3 楼 Nick_ctrl 的回复:
引用 1 楼 byeyear 的回复:
85行执行完后继续86 87 88 89行,up了。
可是89行是在out项里的,也会执行吗?
会执行的。87-89是顺序执行关系,
Nick_ctrl 2017-09-05
  • 打赏
  • 举报
回复
引用 2 楼 wuhanqing 的回复:
如果在 84 释放,出来就会释放两次。 因为拷贝失败也要释放。
对哦,没考虑到这个。但是如果拷贝成功的话,程序会执行到89行吗?
Nick_ctrl 2017-09-05
  • 打赏
  • 举报
回复
引用 1 楼 byeyear 的回复:
85行执行完后继续86 87 88 89行,up了。
可是89行是在out项里的,也会执行吗?
hanqingwu 2017-09-04
  • 打赏
  • 举报
回复
如果在 84 释放,出来就会释放两次。 因为拷贝失败也要释放。
byeyear 2017-08-31
  • 打赏
  • 举报
回复
85行执行完后继续86 87 88 89行,up了。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧