2010-02-14 68 views
12

我需要一种方式在启用或禁用网络接口时通知我的用户空间应用程序。我希望这样做而不诉诸于投票。当网络相关事件发生时,内核是否提供某种钩子来触发回调函数?在Linux上获取有关网络接口更改的通知

+2

关于'rtnetlink',你可能想要检查这个链接的示例代码:http://stackoverflow.com/a/2353441/1435026 – fanyangxi 2012-07-15 03:41:02

回答

20

我相信网络链路(man 7 netlink)设施提供了有关通过NETLINK_ROUTE家庭(man 7 rtnetlink)网络接口的信息。您可以通过netlink套接字上的select()poll()来获取所需的信息。虽然我不确定这一点,我自己并没有使用它。

在更高级别上,如果系统正在运行NetworkManager,则当系统的网络状态发生变化时,该系统将通过D-Bus广播事件。例如,Epiphany浏览器使用这些事件在系统失去网络连接时自动激活“脱机工作”模式,并在网络连接恢复时切换回联机模式。有多种语言的D-Bus客户端库,它比netlink的平台特定性要低,所以这是我推荐使用的。

6

选项:

  • ifplugd将运行您所选择的剧本时,电缆插入或拔出从您的网络接口。

  • 如果您使用的是Debian,您可以将脚本添加到/etc/network的子目录中,其中有每次界面启动或关闭时运行的脚本。

  • 如果以上两种都不适合您的需求,请查看D-Bus。我从来没有多少成功使用它,但这是它的设计目的。

0

为什么不这样做的代码fork,使用popen采取任:

  • 问题tail -f /var/log/messages寻找eth*接口
  • 问题ifconfig看到适配器列表或往上走下来

并解析数据使用pregex,做一个sleep()一段时间,并再次检查..或者你可以去监测e系统日志设施使用'syslog.h'功能。

如果你坚持POSIX标准,代码将横跨在Unix/Linux/BSD的不同口味的便携式...

+2

'ifconfig'不是POSIX和输出实际上变化很多从一个UNIX到另一个。当然,它在所有Linux上都是(大部分)相同的,但即使在那里也有两种不同的常用版本(Busybox和网络工具)。 – ephemient 2010-02-14 20:22:19

0

没有投票或依赖于OS挂钩像诺曼·拉姆齐建议,你唯一的选择就是定期检查几秒钟前的工作界面。这只会导致事件/ rx/tx队列地狱,如果想法是在链路不可用时排队/阻塞等待聊天。

此外,Debian脚本与init脚本一起工作,它们提供的钩子不会告诉您root用户是否使用ifconfig关闭或修改已配置的接口,或者配置一个未描述为init的新配置接口。他们只会告诉你用户是否通过/etc/init.d/networking做了些什么,或者如果init做了同样的事情。

什么是非常可怜的开始一个线程轮询更改?

简言之,是的,你可以开始一个'netnicmond'进程,通知用户名单,让他们知道更改,或者更复杂的实际传达更改。你可能会使用netlink ...

你有没有考虑过使用netlink?

相关问题