2010-02-14 16 views
12

Ho bisogno di un modo per notificare l'app dello spazio utente quando un'interfaccia di rete è abilitata o disabilitata. Spero di farlo senza ricorrere al sondaggio. Il kernel offre una sorta di hook per l'attivazione delle funzioni di callback quando si verificano eventi relativi alla rete?Ricevi notifiche sulla modifica dell'interfaccia di rete su Linux

+2

Informazioni su "rtnetlink", è possibile controllare questo collegamento per il codice di esempio: http://stackoverflow.com/a/2353441/1435026 – fanyangxi

risposta

20

Credo che il netlink (man 7 netlink) impianto fornisce informazioni sulle interfacce di rete tramite il NETLINK_ROUTE famiglia (man 7 rtnetlink). Potresti riuscire a select() o poll() su un socket netlink per ottenere le informazioni desiderate. Non ne sono sicuro, però; Non l'ho usato da solo.

Ad un livello superiore, se il sistema è in esecuzione NetworkManager, trasmetterà eventi tramite D-Bus quando lo stato della rete del sistema cambia. Il browser Epiphany utilizza questi eventi, ad esempio, per attivare automaticamente la modalità "Non in linea" quando il sistema perde la connessione di rete e torna alla modalità online quando riprende la connettività di rete. Ci sono librerie client D-Bus per una varietà di lingue, ed è meno specifico della piattaforma di netlink, quindi questo è quello che consiglio di utilizzare.

6

Opzioni:

  • ifplugd verrà eseguito lo script di vostra scelta quando un cavo è collegato o scollegato dalla propria interfaccia di rete.

  • Se si utilizza Debian, è possibile aggiungere uno script alle sottodirectory di /etc/network, in cui sono presenti script eseguiti ogni volta che un'interfaccia sale o scende.

  • Se nessuno dei precedenti è adatto alle proprie esigenze, consultare D-Bus. Non ho mai avuto molta fortuna ad usarlo con successo, ma questo è il genere di cosa per cui è stato progettato.

0

Perché non fare un fork nel codice, utilizzando popen a che vedere né:

  • Problema tail -f /var/log/messages alla ricerca di eth* interfacce
  • Issue ifconfig per vedere l'elenco delle schede di andare verso l'alto o verso il basso

e analizzare i dati utilizzando un pregex, fare un per un periodo di tempo e ricontrollare di nuovo .. O si potrebbe andare monitor e funzione di registro del sistema utilizzando le funzioni 'syslog.h'.

Se attaccate allo standard POSIX, il codice sarà portabile su diverse versioni di Unix/Linux/BSD ...

+2

"ifconfig' non è POSIX e l'output effettivamente varia molto da un UNIX all'altro. Certo, è (per lo più) lo stesso su tutti i Linux, ma anche lì ci sono due diverse versioni in uso comune (Busybox e net-tools's). – ephemient

0

Senza polling o affidamento su ganci OS come Norman Ramsey ha suggerito, l'unica opzione è quella di controlla periodicamente l'interfaccia di lavoro contro ciò che era pochi secondi fa. Questo porta solo alla coda evento/rx/tx, se l'idea è di accodare/bloccare l'attesa del chatter quando il collegamento non è disponibile.

Inoltre, gli script Debian funzionano in congiunzione con gli script di init, i hook che forniscono non ti dicono se root ha usato ifconfig per down o modificare un'interfaccia configurata, o ne ha configurata una nuova che non è stata descritta per init . Ti dicono solo se l'utente ha fatto qualcosa tramite /etc/init.d/networking, o se init ha fatto lo stesso.

Cosa c'è di così terribilmente infelice nell'iniziare una discussione per il polling delle modifiche?

In mancanza di ciò, sì, si potrebbe avviare un processo di 'netnicmond' che ha segnalato un elenco di iscritti per far loro sapere che qualcosa cambiato, o una più complessa che in realtà trasmesso le modifiche. Probabilmente useresti netlink per questo ...

Hai mai pensato di usare netlink?

Problemi correlati