【发布时间】:2020-04-10 09:29:22
【问题描述】:
我有兴趣将 netlink 用于简单的应用程序(以高频率读取 cgroup 统计信息)。
man page 警告该协议不可靠,暗示应用程序需要准备好处理丢弃的数据包:
然而,从内核到用户的可靠传输是不可能的 任何情况。如果套接字缓冲区,内核无法发送 netlink 消息 已满:消息将被丢弃,内核和用户空间 进程将不再拥有相同的内核状态视图。它 由应用程序来检测何时发生这种情况(通过
ENOBUFSrecvmsg(2)) 返回的错误并重新同步。
由于我的要求很简单,只要有任何意外发生,我只需销毁套接字并创建一个新套接字就可以了。但是我找不到任何关于我的程序期望值的文档——例如,recvmsg(2) 的 man page 甚至没有提到 ENOBUFS。
为了确保我可以判断来自我的应用程序的请求或来自内核的响应已被丢弃,我需要担心什么,以便我可以重置所有内容并重新开始?对我来说很清楚,每当我从涉及的任何系统调用中收到错误时,我都可以这样做,但是例如,如果我的请求在通往内核的途中被丢弃会发生什么?我永远不会收到回复吗?我是否需要建立一个超时机制,让我只等待很长时间才能得到响应?
【问题讨论】:
标签: linux linux-kernel netlink