2010-02-14 20 views
12

Necesito una forma de notificar a mi aplicación de espacio de usuario cuando una interfaz de red está habilitada o deshabilitada. Espero hacer esto sin recurrir a las encuestas. ¿El kernel ofrece algún tipo de enlace para activar las funciones de devolución de llamada cuando ocurren eventos relacionados con la red?Obtenga una notificación sobre el cambio de la interfaz de red en Linux

+2

Acerca de 'rtnetlink', es posible que desee comprobar este enlace para ver el código de ejemplo: http://stackoverflow.com/a/2353441/1435026 – fanyangxi

Respuesta

20

creo que el enlace de red (man 7 netlink) instalación proporciona información sobre las interfaces de red a través de la NETLINK_ROUTE familia (man 7 rtnetlink). Puede obtener select() o poll() en un socket de netlink para obtener la información que desea. Aunque no estoy seguro de esto; No lo he usado yo mismo.

En un nivel superior, si el sistema está ejecutando NetworkManager, emitirá eventos a través de D-Bus cuando cambie el estado de la red del sistema. El navegador Epiphany usa estos eventos, por ejemplo, para activar automáticamente el modo "Trabajar sin conexión" cuando el sistema pierde su conexión de red, y volver al modo en línea cuando se reanuda la conectividad de red. Existen bibliotecas de clientes D-Bus para una variedad de idiomas, y es menos específico de la plataforma que netlink, por lo que esto es lo que recomiendo usar.

6

Opciones:

  • ifplugd se ejecutará la secuencia de comandos de su elección cuando un cable está conectado a o se desconecta de la interfaz de red.

  • Si está utilizando Debian puede agregar una secuencia de comandos a los subdirectorios de /etc/network, donde hay scripts que se ejecutan cada vez que una interfaz sube o baja.

  • Si ninguno de los anteriores es adecuado para sus necesidades, consulte D-Bus. Nunca tuve mucha suerte en usarlo con éxito, pero este es el tipo de cosa para la que fue diseñado.

0

Por qué no hacer un fork en el código, usando popen hacer cualquiera:

  • Edición tail -f /var/log/messages buscando eth* interfaces de
  • Issue ifconfig para ver la lista de adaptadores de subir o bajar

y analizar los datos usando pregex, hacer un sleep() por un período de tiempo y volver a verificar de nuevo .. O podría ir a monitor th e instalación del registro del sistema usando las funciones 'syslog.h'.

Si usted se pega con el estándar POSIX, el código será portable a través de diferentes tipos de Unix/Linux/BSD ...

+2

'ifconfig' no es POSIX y la salida en realidad varía bastante de UNIX a otro. Claro, es (la mayoría) lo mismo en todos los Linuxes, pero incluso allí hay dos versiones diferentes de uso común (Busybox y net-tools). – ephemient

0

sin necesidad de consultar o confiar en los ganchos del sistema operativo como Norman Ramsey sugirió, su única opción es revise periódicamente la interfaz de trabajo con respecto a lo que era hace unos segundos. Eso solo lleva a event/rx/tx queue hell, si la idea es poner en cola/bloquear la espera de la charla cuando el enlace no está disponible.

Además, las secuencias de comandos de Debian funcionan junto con las secuencias de comandos de inicio, los enlaces que proporcionan no le dicen si la raíz utilizó ifconfig para abajo o modificó una interfaz configurada, o configuró una nueva que no se describió para init . Solo le dicen si el usuario hizo algo a través de /etc/init.d/networking, o si init hizo lo mismo.

¿Qué es tan terriblemente miserable acerca de cómo iniciar un hilo para sondear en busca de cambios?

De eso, sí, podría iniciar un proceso 'netnicmond' que señala una lista de suscriptores para informarles que cambió algo, o uno más complejo que realmente transmitió los cambios. Probablemente usaría netlink para eso ...

¿Ha considerado usar netlink?

Cuestiones relacionadas