2010-02-14 69 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?

相關問題