如何解决FreeBSD 上的网络接口状态跟踪
我正在将一些软件移植到 FreeBSD 12(它从未在 FreeBSD 上运行过)。该软件需要跟踪系统网络接口并立即对状态变化做出反应。它假定以 root 权限运行。在 FreeBSD 7 中,有 kevent
和 EVFILT_NETDEV 的组合,但该标志已从 FreeBSD 8 及更高版本中删除,没有明确替换。
我知道有一种方法可以使用 getifaddrs
检索接口,但不知道如何在跟踪向上/向下事件的 AF_INET
和 AF_INET6
设备上继续和设置处理程序。>
devd
看起来很有希望,因为它可以捕获相应的 IFNET
事件,唉,禁止在目标系统上调整 devd.conf,因此我需要在我的 sfw 中实现类似的机制。我没有太多时间去检查 devd 的源代码,尽管我已经尝试过,这让它变得更加神秘。
有人能告诉我正确的方向吗?也许是一些 libdev* 系统范围的库?
谢谢。
解决方法
找到了使用 devd 的多路复用管道的相应库。它名为 libdevdctl
,其源代码位于 /usr/src/lib/libdevdctl
中,用 C++ 编写,没有额外的依赖项。 DevdCtl::Event::NOTIFY
和 DevdCtl::Consumer
的组合就足够了。出于某种原因,/usr/lib
中的共享库被称为 libprivatedevdctl.so
,并且根据 nm 输出公开所需的接口。我认为它只是一个内部库,因此可以更轻松地获取源代码并按原样在您的软件中使用。
此外,它有一个严重的缺点,它poll
在 DevdCtl::Consumer::EventsPending
中的套接字为零超时,这会大大增加 CPU 使用率。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。