我需要一種方式在啓用或禁用網絡接口時通知我的用戶空間應用程序。我希望這樣做而不訴諸於投票。當網絡相關事件發生時,內核是否提供某種鉤子來觸發回調函數?在Linux上獲取有關網絡接口更改的通知
回答
我相信網絡鏈路(man 7 netlink
)設施提供了有關通過NETLINK_ROUTE
家庭(man 7 rtnetlink
)網絡接口的信息。您可以通過netlink套接字上的select()
或poll()
來獲取所需的信息。雖然我不確定這一點,我自己並沒有使用它。
在更高級別上,如果系統正在運行NetworkManager,則當系統的網絡狀態發生變化時,該系統將通過D-Bus廣播事件。例如,Epiphany瀏覽器使用這些事件在系統失去網絡連接時自動激活「脫機工作」模式,並在網絡連接恢復時切換回聯機模式。有多種語言的D-Bus客戶端庫,它比netlink的平臺特定性要低,所以這是我推薦使用的。
選項:
ifplugd
將運行您所選擇的劇本時,電纜插入或拔出從您的網絡接口。如果您使用的是Debian,您可以將腳本添加到
/etc/network
的子目錄中,其中有每次界面啓動或關閉時運行的腳本。如果以上兩種都不適合您的需求,請查看D-Bus。我從來沒有多少成功使用它,但這是它的設計目的。
爲什麼不這樣做的代碼fork
,使用popen
採取任:
- 問題
tail -f /var/log/messages
尋找eth*
接口 - 問題
ifconfig
看到適配器列表或往上走下來
並解析數據使用pregex
,做一個sleep()
一段時間,並再次檢查..或者你可以去監測e系統日誌設施使用'syslog.h'功能。
如果你堅持POSIX標準,代碼將橫跨在Unix/Linux/BSD的不同口味的便攜式...
'ifconfig'不是POSIX和輸出實際上變化很多從一個UNIX到另一個。當然,它在所有Linux上都是(大部分)相同的,但即使在那裏也有兩種不同的常用版本(Busybox和網絡工具)。 – ephemient 2010-02-14 20:22:19
沒有投票或依賴於OS掛鉤像諾曼·拉姆齊建議,你唯一的選擇就是定期檢查幾秒鐘前的工作界面。這隻會導致事件/ rx/tx隊列地獄,如果想法是在鏈路不可用時排隊/阻塞等待聊天。
此外,Debian腳本與init腳本一起工作,它們提供的鉤子不會告訴您root用戶是否使用ifconfig關閉或修改已配置的接口,或者配置一個未描述爲init的新配置接口。他們只會告訴你用戶是否通過/etc/init.d/networking做了些什麼,或者如果init做了同樣的事情。
什麼是非常可憐的開始一個線程輪詢更改?
簡言之,是的,你可以開始一個'netnicmond'進程,通知用戶名單,讓他們知道更改,或者更復雜的實際傳達更改。你可能會使用netlink ...
你有沒有考慮過使用netlink?
- 1. 如何獲取網絡更改通知(連接,斷開,更改)
- 2. 有關iOS上的網絡狀態更改的通知
- 3. Wifi網絡更改通知
- 4. 獲取有關Android設備上WiFi狀態更改的通知?
- 5. 更改linux的網絡連接類型
- 6. 如何更改網絡接口的網絡緩衝區以獲取錯誤?
- 7. 如何從iOS Reachability Class獲取網絡連接通知的更改?
- 8. (C,Linux)知道網絡接口是無線還是有線
- 9. 有關互聯網連接的通知在linux中不見了?
- 10. 獲取有關網絡AFRAME
- 11. 網絡狀態更改通知
- 12. 如何在Linux上以編程方式獲取網絡接口速度?
- 13. 獲取有關Google日曆中的更改的通知
- 14. 在Arch Linux中禁用網絡接口
- 15. 爲所有更改獲取MediaWiki通知
- 16. 獲取有關iPhone更改通知的地址簿
- 17. 獲取有關cgroup進程更改的通知?
- 18. 如何獲取有關綁定集合中更改的通知?
- 19. 使用Mailkit獲取有關收件箱更改的通知
- 20. 如何獲取有關數據庫列更改的通知
- 21. 在Ruby上獲取特定網絡接口的IP地址
- 22. 重置Linux中的網絡接口
- 23. 獲取網絡接口信息
- 24. 獲取網絡接口信息C++
- 25. 在Linux下更改網絡接口的名稱,但忽略文件70-persistent-net.rules
- 26. 如何告訴Qt網絡更改輸出網絡接口?
- 27. 是否有針對WiFi網絡更改的NSNotificationCenter通知?
- 28. 如何在iOS上獲取網絡接口信息(例如'en0')?
- 29. 獲取Firebase網絡通知即使關閉Chrome
- 30. 修改通過接口發送的所有網絡數據包
關於'rtnetlink',你可能想要檢查這個鏈接的示例代碼:http://stackoverflow.com/a/2353441/1435026 – fanyangxi 2012-07-15 03:41:02