Home Corsi Programmazione Linux I Linux kernel notifier

In evidenza

I riflettori della Fiera del Levante si accendono su SMAU Bari 2012

I riflettori della Fiera del Levante si accendono su SMAU Bari 2012

Dal 15 al 16 febbraio nel Nuovo Padiglione della Fiera del Levante, la quarta edizione di Smau sarà dedicata ...
TecnoWorkshop Lucca2011

TecnoWorkshop Lucca2011

Finalmente, e dopo un po' di peripezie siamo riusciti ad organizzare il primo TecnoWorkshop del nostro...
Società Italiana dei Professionisti delle Scienze dell'Informazione

Società Italiana dei Professionisti delle Scienze dell'Informazione

La Società Italiana dei Professionisti delle Scienze dell'Informazione (acronimo SIPSI) è una associazione...
Testata Giornalistica

Testata Giornalistica

Il portale Professionisti e Consulenti ICT - Italia è ora una testata giornalistica a tutti gli effetti...

Bandi di Concorso

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Concorso pubblico per informatico alla Corte dei Conti

E' indetto un concorso pubblico, per   esami,   per   il reclutamento di tre unità di informatici da inquadrare nella III area, fascia retributiva F1, da destinare agli Uffici della Corte dei Conti con sede in Roma. Requisiti: laurea triennale in scienze e...

05 Feb 2012 - Letture:81

Istruttore informatico L.68/1999 al Comune di Potenza

Concorso pubblico, per esami, per la copertura di n. 2 posti di Istruttore Informatico, categoria C, posizione economica C1, a tempo pieno e indeterminato, con riserva assoluta alle categorie dilavoratori di cui all'art. 1 della legge n. 68/1999 (norme per...

21 Gen 2012 - Letture:86

Senior Business Consultant presso Lombardia Informatica

Selezione per figura Senior Business Consultant presso Lombardia Informatica. Il collaboratore dovrà fornire consulenza strategica e di business sulle tematiche verticali della Socio-Sanità. Requisiti di ammissione: Laurea in Ingegneria, Economia e Commercio o Scienze dell’Informazione; Percorsi di formazione professionale in ambito sanitario e socio-sanitario, su...

11 Gen 2012 - Letture:140

Bando progetto TAG (Toscana Area Giovani) per giovani talenti digitali

UPI Toscana ha indetto un avviso pubblico per la selezione di 20 giovani (2 per ciascuna delle 10 province della Toscana), da impiegare come formatori all'interno del Progetto TAG (Toscana Area Giovani). Il bando è finalizzato a valorizzare al meglio i...

03 Gen 2012 - Letture:147

Avviso pubblico per giovani dottori di ricerca per Uffici di Gabinetto

Avviso pubblico per il conferimento di n. 6 incarichi presso gli Uffici di diretta collaborazione del Ministro dell'istruzione dell'università e della ricerca, per soggetti estranei alla pubblica amministrazione. Ambiti di esperienza e Aree di competenza: Nuovi Media: nuove forma di comunicazione tra...

02 Gen 2012 - Letture:101

Database Administrator in the Information Technology (IT) Department at CERN

E' aperta una posizione nel gruppo di lavoro che fornisce servizi Database e Middleware al CERN, un'organizzazione internazionale che fa fisica delle particelle di stanza a Ginevra, Svizzera. Direttamente dal sito del bando si legge: as Database Administrator in the Database...

12 Dic 2011 - Letture:154

Posto per collaboratore tecnico CROB a Rionero in Vulture (PZ)

Indetto pubblico concorso, per titoli ed esami, per la copertura di un posto di collaboratore tecnico professionale esperto - Ingegnere - Cat. DS presso il centro di riferimento oncologico della Basilicata in Rionero in Vulture (PZ).

22 Nov 2011 - Letture:259

I più attivi

Dati e punteggi dell'ultimo anno

Giovanna Casamassima Giovanna Casamassima
47 articoli
12,692 punti totali
Rodolfo Giometti Rodolfo Giometti
45 articoli
6,854 punti totali
Vittorio D'Aversa Vittorio D'Aversa
34 articoli
3,037 punti totali
Fulvio Lucchetti Fulvio Lucchetti
11 articoli
0,552 punti totali
Fabio Bronzini Fabio Bronzini
12 articoli
0,501 punti totali

Ci hanno visitato

Oggi:2120
Ieri:2515
Totali (14/04/09):927602

I nostri numeri

Articoli pubblicati: 519
Iscritti al portale: 677
Iscritti all'Elenco: 175
Iscritti ML Discussioni: 333
Iscritti ML Articoli: 28
Iscritti ML Lavoro: 166
 
I Linux kernel notifier Stampa E-mail
(0 voti, media 0 di 5)
Area Corsi - Programmazione Linux
Scritto da Rodolfo Giometti   
Lunedì 26 Luglio 2010 08:26
Articolo letto 1056 volte

All'interno di un sistema operativo possono accadere diversi eventi, ed ancora di più ne accadono all'interno del kernel (quella parte di software, cioé, che è a diretto contatto con la CPU e tutte le periferiche).

Linux essendo il kernel dei sistemi GNU/Linux non è da meno ed offre una interfaccia abbastanza evoluta per la gestione della notifica di questi eventi verso chiunque ne faccia richiesta: questa interfaccia sono i kernel notifier.

Cosa sono

I kernel notifier non sono altro che delle code di funzioni (callback) da invocare ogni qual volta si verifica un evento notevole nel sistema. Chiunque voglia ricevere queste notifiche non fa altro che iscriversi ad una o più di queste code specificando anche la propria callback, e, quando l'evento si verifica, la callback viene automaticamente invocata.

Nati inizialmente per notificare gli eventi legati al sottosistema di networking, i kernel notifier si sono poi diffusi anche per altri compiti e vengono ora utilizzati per diverse applicazioni: eventi di power management, eventi di tastiera, errori notevoli, ecc..

L'interfaccia viene definita all'interno del file linux/kernel/notifier.c il quale esporta diversi simboli. I più importanti sono:

int atomic_notifier_chain_register(struct atomic_notifier_head *nh,
                                   struct notifier_block *n);

int atomic_notifier_chain_unregister(struct atomic_notifier_head *nh,
                                   struct notifier_block *n);

che registrano/deregistrano notiier proteggendoli con degli spinlock e quindi eseguibili anche in interrupt context, e:

int __kprobes atomic_notifier_call_chain(struct atomic_notifier_head *nh,
                                   unsigned long val, void *v);

che invoca i notifier registrati con le funzioni su riportate.

Nei casi, invece, in cui il codice che fa la richiesta di registrazione/deregistrazione esegua in process context si possono usare:

int blocking_notifier_chain_register(struct blocking_notifier_head *nh,
                                   struct notifier_block *n);

int blocking_notifier_chain_unregister(struct blocking_notifier_head *nh,
                                   struct notifier_block *n);

int blocking_notifier_call_chain(struct blocking_notifier_head *nh,
                                   unsigned long val, void *v);

Che usano come meccanismi di lock i dei semafori.

Come si usano

Utilizzare i kernel notifier è molto semplice, basta definire una coda su cui accodare le richieste di notifica e definire delle funzioni di registrazione/deregistrazione e di invocazione.

Per fare un esempio pratico si riporta il file linux/net/core/netevent.c che illustra benissimo questi concetti nella sua semplicità:

#include <linux/rtnetlink.h>
#include <linux/notifier.h>
#include <net/netevent.h>

static ATOMIC_NOTIFIER_HEAD(netevent_notif_chain);

/**
 *      register_netevent_notifier - register a netevent notifier block
 *      @nb: notifier
 *
 *      Register a notifier to be called when a netevent occurs.
 *      The notifier passed is linked into the kernel structures and must
 *      not be reused until it has been unregistered. A negative errno code
 *      is returned on a failure.
 */
int register_netevent_notifier(struct notifier_block *nb)
{
        int err;

        err = atomic_notifier_chain_register(&netevent_notif_chain, nb);
        return err;
}

/**
 *      netevent_unregister_notifier - unregister a netevent notifier block
 *      @nb: notifier
 *
 *      Unregister a notifier previously registered by
 *      register_neigh_notifier(). The notifier is unlinked into the
 *      kernel structures and may then be reused. A negative errno code
 *      is returned on a failure.
 */

int unregister_netevent_notifier(struct notifier_block *nb)
{
        return atomic_notifier_chain_unregister(&netevent_notif_chain, nb);
}

/**
 *      call_netevent_notifiers - call all netevent notifier blocks
 *      @val: value passed unmodified to notifier function
 *      @v:   pointer passed unmodified to notifier function
 *
 *      Call all neighbour notifier blocks.  Parameters and return value
 *      are as for notifier_call_chain().
 */

int call_netevent_notifiers(unsigned long val, void *v)
{
        return atomic_notifier_call_chain(&netevent_notif_chain, val, v);
}

EXPORT_SYMBOL_GPL(register_netevent_notifier);
EXPORT_SYMBOL_GPL(unregister_netevent_notifier);
EXPORT_SYMBOL_GPL(call_netevent_notifiers);

Con la define ATOMIC_NOTIFIER_HEAD() si definisce allora la coda per gli eventi di tipo atomic e poi di esportano tre funzioni per la gestione degli eventi: una di registrazione (la register_netevent_notifier()), una di deregistrazuione (la unregister_netevent_notifier()) e una di inocazione (la unregister_netevent_notifier()).

Quando si vuol iscriversi a queste code basta allora definre la propria callback ed invocare la funzione di registrazione come segue:

static int netevent_callback(struct notifier_block *self, unsigned long event,
        void *ctx)
{
        if (event == NETEVENT_NEIGH_UPDATE) {
                struct neighbour *neigh = ctx;

                if (neigh->nud_state & NUD_VALID) {
                        set_timeout(jiffies);
                }
        }
        return 0;
}

static struct notifier_block nb = {
        .notifier_call = netevent_callback
};

static int __init addr_init(void)
{
        addr_wq = create_singlethread_workqueue("ib_addr");
        if (!addr_wq)
                return -ENOMEM;

        register_netevent_notifier(&nb);
        return 0;
}

static void __exit addr_cleanup(void)
{
        unregister_netevent_notifier(&nb);
        destroy_workqueue(addr_wq);
}

 


Questa dispensa del corso Programmazione Linux è opera di Rodolfo Giometti (Copyright © 2010) ed è rilasciata dall'autore «as is» (così com'è) e distribuita sotto licenza Creative Commons Attribuzione – Condividi allo stesso modo 2.5 Italia.

 

Aggiungi commento

Prima di pubblicare un tuo commento assicurati che:

  • sia in tema e contribuisca alla discussione in corso.

  • non abbia contenuto razzista o sessista.

  • non sia offensivo, calunnioso o diffamante.


La redazione con i controlli a campione si riserva di cancellare qualsiasi contenuto ingiurioso, volgare o illegale.


Nota bene: se non sei registrato il tuo commento verrà moderato e quindi non pubblicato immediatamente. Se, invece, sei registrato al portale e hai fatto login verrà visualizzato subito.


Codice di sicurezza
Aggiorna

 

In primo piano

Simons Voss: un mondo senza chiavi

Simons Voss: un mondo senza chiavi

Il sistema di gestione e di controllo degli accessi 3060 si presenta come un’alternativa con enormi vantaggi...
Pubblicità mirata dei prodotti

Pubblicità mirata dei prodotti

Hai un prodotto o un servizio da pubblicizzare? Fallo su consulenti-ict.it! Pubblicizzare un prodotto...
Recensioni sul Portale

Recensioni sul Portale

Hai un prodotto hardware/software o un libro riguardante uno dei temi dell'ICT? Vuoi farlo conoscere...

Ultime dal Forum

Visualizza Topic »

Eventi

Non ci sono eventi in programma
Febbraio 2012
D L M M G V S
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 1 2 3
Marzo 2012
D L M M G V S
26 27 28 29 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Sondaggi

busyCaricamento Sondaggio...

Ultimi Commenti