我正在将一些软件移植到FreeBSD 12(它从未在FreeBSD上运行过)。该软件需要跟踪系统网络接口,并立即对状态更改做出React。它假定以root权限运行。在FreeBSD 7中有kevent
和EVFILT_NETDEV的组合,但这个标志已经从FreeBSD 8和更高版本中删除,没有明确的替代品。
我知道有一种方法可以使用getifaddrs
检索接口,但不知道如何继续并在AF_INET
和AF_INET6
设备上设置处理程序来跟踪up/down事件。devd
看起来很有希望,因为它可以捕获相应的IFNET
事件,可惜它禁止在目标系统上调整devd.conf,因此我需要在我的sfw中实现类似的机制。我没有太多的时间来检查devd的源代码,即使我已经尝试过了,它使它更加神秘。
有谁能告诉我正确的方向吗?也许是一些libdev* 系统范围的库?
谢谢.
1条答案
按热度按时间kb5ga3dv1#
找到使用devd的多路复用管道的相应库。它被称为
libdevdctl
,其源代码驻留在/usr/src/lib/libdevdctl
中,用C++编写,没有额外的依赖关系。DevdCtl::Event::NOTIFY
和DevdCtl::Consumer
的组合就足够了。出于某种原因,/usr/lib
中的共享库被称为libprivatedevdctl.so
,并根据nm输出暴露所需的接口。我认为它只是一个内部库,所以更容易获取源代码并在软件中使用。此外,它有一个严重的缺点,它
poll
是DevdCtl::Consumer::EventsPending
中零超时的套接字,这大大增加了CPU的使用率。