2012-10-19 8 views
8

Sto scrivendo un demone C, che dipende dall'esistenza di due moduli del kernel per svolgere il proprio lavoro. Il programma non utilizza direttamente questi (o altri) moduli. Ha solo bisogno di loro di esistere. Pertanto, vorrei verificare a livello di codice se questi moduli sono già caricati o meno, al fine di avvisare l'utente in fase di runtime.Controllare a livello di codice se esiste o meno un modulo del kernel linux in fase di esecuzione

Prima di iniziare a eseguire operazioni come l'analisi dell'uscita /proc/modules o lsmod, esiste già una funzione di utilità? Qualcosa come is_module_loaded(const char* name);

Sono sicuro che questo è stato chiesto prima. Tuttavia, penso che mi mancano i termini corretti per cercare questo.

risposta

3

È possibile utilizzare popen e lsmod | grep trucco:

FILE *fd = popen("lsmod | grep module_name", "r"); 

    char buf[16]; 
    if (fread (buf, 1, sizeof (buf), fd) > 0) // if there is some result the module must be loaded 
    printf ("module is loaded\n"); 
    else 
    printf ("module is not loaded\n"); 
+0

Sembra molto sporco ma funziona e non ho mai pensato a una soluzione così semplice. Cheers – dgraziotin

+1

Dato che lsmod apre "/ proc/modules", e che grep implica un altro processo e file aggiuntivi si apre per la pipe, sarebbe più efficiente usare "grep nome_modulo/proc/modules" e verificare se c'è qualche output da quello invece? Ciò funzionerebbe anche se lsmod non fosse disponibile. – Jeremy

12

Non esiste tale funzione. Infatti, il codice sorgente di lsmod (lsmod.c) ha la seguente riga in esso che si dovrebbe portare alla soluzione:

file = fopen("/proc/modules", "r"); 

C'è anche un deprecato query_module ma sembra esistere solo nelle intestazioni del kernel in questi giorni.

+0

La mia domanda era abbastanza ambigua sia per chiedere per l'esistenza di tale funzione e come codificare la funzionalità. Pertanto, ho intenzione di revocare la tua risposta e accettare la risposta @tozka, perché funziona per me. Grazie per le spiegazioni! – dgraziotin