【问题标题】:How are netlink sockets in the Linux kernel different from polling from userland?Linux 内核中的 netlink 套接字与从用户态轮询有何不同?
【发布时间】:2013-05-24 03:23:54
【问题描述】:

我怀疑 netlink 套接字在内核-应用程序交互上下文中的功能。正如我所读到的,netlink 套接字用于从内核到应用程序的基于事件的通知。这样做的好处是应用程序不需要轮询。

但是和netlink socket一样,它最终也会轮询以检查是否有一些数据已经从内核发送。所以我的问题是,netlink 套接字的这种功能与文件描述符的轮询有何不同? 我提到了this,但它告诉了如何使用 netlink,而不是 netlink 套接字和轮询之间的区别。

【问题讨论】:

  • poll() 函数调用不同于hardware polling。许多read() 很可能会返回-1;对比边缘触发与持续读取I/O 值。你读到的可能不是指poll(),系统调用。

标签: linux linux-kernel embedded-linux netlink


【解决方案1】:

对于应用程序,netlink 套接字和其他设备文件的行为大多相似(即调用pollread)。

如果您需要 netlink 的功能之一(例如多播),或者如果您的驱动程序变得更易于实现(内核端 API 更类似于套接字并具有内置缓冲),您将使用 netlink,因为您不需要' t 你必须自己编写文件操作。

【讨论】:

  • 多播会有什么不同?好像内核向应用程序发送多播或那些应用程序不断轮询设备文件,最终它是相同的,不是吗?
  • 组播与任何单个端点的接口无关。
  • 其实我想知道是什么让 netlink 套接字比轮询更可取。我从平台端检查了 UeventObserver.java 和 uevent.c 的代码。两个文件中都有一个 while 循环,它会继续检查事件。那么它有多好,为什么内核开发人员更喜欢 netlink 套接字而不是任何其他 proc 或 sysfs 文件系统来通信?
  • 感谢您留下这个问题 :) .. 但还有一件事,在同一个链接中有一段说“通常,应用程序需要定期轮询内核以获取状态更改,尽管密集轮询是昂贵的。Netlink 通过允许内核也可以启动会话来优雅地解决这个问题“即使它允许启动会话,最终应用程序将最终轮询套接字。所以在那种情况下,我们如何使用 netlink 套接字说我们正在跳过激烈的轮询。
  • 呼叫poll 只是等待。本文所说的“轮询”是指定期检查状态。
猜你喜欢
  • 1970-01-01
  • 2011-03-18
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2012-11-26
  • 2014-05-05
  • 1970-01-01
相关资源
最近更新 更多