我需要一种方法来通知我的用户空间应用程序何时启用或禁用网络接口。我希望不使用轮询来实现这一点。内核是否提供某种挂钩,以便在发生网络相关事件时触发回调函数?
sf6xfgos1#
我相信netlink(man 7 netlink)工具通过NETLINK_ROUTE系列(man 7 rtnetlink)提供有关网络接口的信息。您可以在netlink套接字上使用select()或poll()来获取您想要的信息。不过,我不确定这一点;我自己没有使用过它。在更高的级别上,如果系统运行的是NetworkManager,当系统的网络状态发生变化时,它将通过D-Bus广播事件。例如,Epiphany浏览器使用这些事件在系统失去网络连接时自动激活“脱机工作”模式,并在网络连接恢复时切换回在线模式。有各种语言的D-Bus客户端库,而且它比netlink更少平台特定性,所以我推荐使用它。
man 7 netlink
NETLINK_ROUTE
man 7 rtnetlink
select()
poll()
js5cn81o2#
选项:
ifplugd
/etc/network
rqcrx0a63#
在Debian版本12(Bookworm)中,以下文件夹中的文件会在接口更改时执行:/etc/NetworkManager/dispatcher.d/我在我使用的raspberry pi中添加了第二个文件02-ifupdown。该文件会传递args $1 & $2作为接口名称和状态。
ha5z0ras4#
为什么不在代码中执行fork,使用popen来执行以下操作之一:
fork
popen
tail -f /var/log/messages
eth*
ifconfig
并使用pregex解析数据,在一段时间内执行sleep()并再次检查..或者您可以使用'syslog.h'函数监视系统日志工具。如果你坚持Posix标准,代码将在不同风格的Unix/Linux/BSD之间移植。
pregex
sleep()
4条答案
按热度按时间sf6xfgos1#
我相信netlink(
man 7 netlink
)工具通过NETLINK_ROUTE
系列(man 7 rtnetlink
)提供有关网络接口的信息。您可以在netlink套接字上使用select()
或poll()
来获取您想要的信息。不过,我不确定这一点;我自己没有使用过它。在更高的级别上,如果系统运行的是NetworkManager,当系统的网络状态发生变化时,它将通过D-Bus广播事件。例如,Epiphany浏览器使用这些事件在系统失去网络连接时自动激活“脱机工作”模式,并在网络连接恢复时切换回在线模式。有各种语言的D-Bus客户端库,而且它比netlink更少平台特定性,所以我推荐使用它。
js5cn81o2#
选项:
ifplugd
将在电缆插入或拔出网络接口时运行您选择的脚本。/etc/network
的子目录中,其中有每当接口打开或关闭时运行的脚本。rqcrx0a63#
在Debian版本12(Bookworm)中,以下文件夹中的文件会在接口更改时执行:/etc/NetworkManager/dispatcher.d/我在我使用的raspberry pi中添加了第二个文件02-ifupdown。该文件会传递args $1 & $2作为接口名称和状态。
ha5z0ras4#
为什么不在代码中执行
fork
,使用popen
来执行以下操作之一:tail -f /var/log/messages
,查找eth*
接口ifconfig
命令以查看向上或向下运行的适配器列表并使用
pregex
解析数据,在一段时间内执行sleep()
并再次检查..或者您可以使用'syslog.h'函数监视系统日志工具。如果你坚持Posix标准,代码将在不同风格的Unix/Linux/BSD之间移植。