udp_rcv函数中的一个疑问
子函数udp_queue_rcv_skb中
- if (!sock_owned_by_user(sk))
- rc = __udp_queue_rcv_skb(sk, skb);
- else
- sk_add_backlog(sk, skb);
复制代码看字面意思,如果用户空间没有持有锁,就将skb加入到收包队列中去,等待用户空间进行recvfrom
否则调用sk_add_backlog,不知道这个流程什么意思?这时候内核收到的skb难道用户空间获取不到了?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
是的。
包被加入到 sk->sk_backlog中后,直到某个事件(sock被释放,被解锁),队列中数据
会被转移到 sk_receive_queue队列中。
用户层只能直接从 sk_receive_queue中获取数据包。
回复 1# phoxia
回复 2# asweisun_shan
哪个函数会将back队列中的数据移到sk_receive_queue队列中去?谢谢!
回复 2# asweisun_shan
找到了
release_sock会调用回掉函数sk_backlog_rcv将back队列中的数据移到receive队列中去,对于udp协议就是调用sock_queue_rcv_skb
谢谢!