我需要一种在启用或禁用网络接口时通知我的用户空间应用的方法。我希望在不诉诸民意的情况下这样做。当网络相关事件发生时,内核是否提供某种钩子来触发回调函数?
答案 0 :(得分:21)
我相信netlink(man 7 netlink
)工具通过NETLINK_ROUTE
系列(man 7 rtnetlink
)提供有关网络接口的信息。您可以在netlink套接字上select()
或poll()
获取所需信息。不过,我不确定这一点;我自己没有用过。
在更高级别,如果系统正在运行NetworkManager,那么当系统的网络状态发生变化时,它将通过D-Bus广播事件。例如,Epiphany浏览器使用这些事件在系统失去网络连接时自动激活“脱机工作”模式,并在网络连接恢复时切换回在线模式。有各种语言的D-Bus客户端库,它不像netlink那样特定于平台,所以这就是我推荐使用的。
答案 1 :(得分:7)
选项:
ifplugd
将运行您选择的脚本。
如果您使用的是Debian,则可以将脚本添加到/etc/network
的子目录中,每次接口启动或关闭时都会运行脚本。
如果以上两种情况都不适合您的需求,请查看D-Bus。我从未如此成功地使用它,但这是它的设计目的。
答案 2 :(得分:0)
在没有轮询或依赖Norman Ramsey建议的操作系统挂钩的情况下,您唯一的选择是定期检查工作界面与几秒钟之前的情况。这只会导致event / rx / tx队列地狱,如果想要在链接不可用时排队/阻止等待聊天。
此外,Debian脚本与init脚本一起使用,它们提供的钩子不会告诉您root是否使用ifconfig来关闭或修改已配置的接口,或者配置了一个未向init描述的新脚本。他们只告诉你用户是否通过/etc/init.d/networking做了什么,或者init是否做了同样的事情。
关于启动一个线程来轮询更改,有什么可怕的不幸?
没错,是的,您可以启动一个'netnicmond'流程,该流程表示订阅者列表让他们知道某些已更改,或者更复杂的实际传达了更改。你可能会使用netlink ...
您是否考虑过使用netlink?
答案 3 :(得分:-1)
为什么不在代码中执行fork
,使用popen
执行以下操作:
tail -f /var/log/messages
正在寻找eth*
接口ifconfig
以查看适配器列表上升或下降使用pregex
解析数据,执行sleep()
一段时间并重新检查..或者您可以使用“syslog.h”监控系统日志工具功能
如果你坚持使用Posix标准,代码将可以在不同版本的Unix / Linux / BSD中移植......