Мне нужен способ уведомить мое приложение пространства пользователя, когда сетевой интерфейс включен или отключен. Я надеюсь сделать это, не обращаясь к опросу. Ядро предлагает своего рода рычаг для инициирования функций обратного вызова, когда связанные с сетью события имеют место?
Я полагаю, что средство netlink (man 7 netlink
) предоставляет информацию о сетевых интерфейсах через семейство NETLINK_ROUTE
(man 7 rtnetlink
). Возможно, вы сможете select()
или poll()
на сокете netlink для получения нужной вам информации. Однако я не уверен в этом; я сам не использовал это.
На более высоком уровне, если в системе запущен NetworkManager, он будет транслировать события через D-Bus при изменении сетевого статуса системы. Браузер Epiphany использует эти события, например, для автоматической активации режима "Работа в автономном режиме", когда система теряет сетевое соединение, и переключения обратно в онлайн-режим, когда сетевое соединение возобновляется. Существуют клиентские библиотеки D-Bus для различных языков, и они менее привязаны к конкретной платформе, чем netlink, поэтому я бы рекомендовал использовать именно их.
Почему бы не сделать fork
в коде, используя popen
для выполнения любого из этих действий:
tail -f /var/log/messages
для поиска eth*
интерфейсовifconfig
для просмотра списка адаптеров, идущих вверх или внизи разобрать данные с помощью pregex
, сделать sleep()
на некоторое время и перепроверить снова. . Или вы можете просмотреть системный журнал, используя функции 'syslog.h'.
Если вы будете придерживаться стандарта Posix, код будет переносимым в различных версиях Unix/Linux/BSD...
Параметры:
ifplugd
запустит сценарий по вашему выбору, когда кабель подключен к сетевому интерфейсу или отключен от него.
Если вы используете Debian, вы можете добавить сценарий в подкаталоги / etc / network
, где есть сценарии, которые запускаются каждый раз, когда интерфейс отключается или отключается.
Если ни один из вышеперечисленных вариантов не подходит для ваших нужд, обратитесь к D-Bus . Мне никогда не удавалось успешно использовать его, но это то, для чего он был разработан.
Без опроса или полагаясь на хуки ОС, как предложил Norman Ramsey, ваш единственный вариант - периодически сверять рабочий интерфейс с тем, что было несколько секунд назад. Это приводит только к аду очереди событий / rx / tx, если идея состоит в том, чтобы ставить в очередь / блокировать ожидание болтовни, когда связь недоступна.
Кроме того, скрипты Debian работают в сочетании со скриптами init, крючки, которые они предоставляют, не скажут вам, использовал ли root ifconfig для отключения или изменения настроенного интерфейса, или настроил новый интерфейс, который не был описан в init. Они скажут вам только, сделал ли пользователь что-то через /etc/init.d/networking, или сделал ли init то же самое.
Что такого ужасно убогого в запуске потока для опроса изменений?
Если коротко, то да, вы можете запустить процесс 'netnicmond', который сигнализирует списку подписчиков, чтобы сообщить им, что что-то изменилось, или более сложный процесс, который действительно передает изменения. Вероятно, для этого вы бы использовали netlink...
А вы не думали просто использовать netlink?