Domanda

Attualmente sto provando a creare un modulo del kernel che produrrà dati basati su eventi del kernel e li inserirà in un file. Dopo aver letto che ciò non va (e sono d'accordo), ho deciso che avrebbe più senso avere i dati in un file / proc da cui un programma utente potrebbe estrarre quando necessario. Tuttavia, questa idea ha portato a tutti i tipi di problemi, in particolare quando e come cancellare questo file. Quindi ho pensato ... " perché non creo una pipe con nome in / proc e leggo da quella? & Quot;

Ho l'essenza generale di impostare una funzione di lettura e una funzione di scrittura per un file proc, ma ho ancora problemi concettuali su come procedere. Vale a dire, come scriverei una tale funzione per prendere dati arbitrari e scriverli in una tale pipe dal kernel? Qualcuno ha idea di come spingeresti i dati in una pipe denominata da kernel-space? Alla fine, non deve essere un file / proc (in particolare se è sbagliato da parte mia farlo), ma questa è stata la conclusione a cui sono arrivato. Quindi dovrò capire come collegarlo a un programma di spazio utente, ma ritengo che sia un problema separato.

È stato utile?

Soluzione

Invece di creare una pipa denominata, quello che vuoi fare è creare un dispositivo a carattere "quotato". Se si desidera una semplice interazione o lo streaming di dati dal kernel allo spazio utenti e viceversa, questo è il solito metodo. Consiglio di cercare dispositivi simili nel kernel di Linux e di vedere cosa fanno.

Altri suggerimenti

Penso che il modo in cui ciò viene generalmente fatto sia utilizzare un socket netlink; uno o più processi di spazio utente possono essere associati a un "netlink" indirizzo e la tua struttura del kernel può trasmettere messaggi a qualsiasi / tutti, se necessario.

Questo è certamente ciò che fanno alcune cose, in particolare il sottosistema di rete. È possibile che un programma per lo spazio utente controlli i cambiamenti nelle interfacce di rete (ad es. Nuovi indirizzi IP, modifica dello stato dei collegamenti) usando questo metodo.

Sono d'accordo con Paul: l'implementazione di un dispositivo a caratteri è probabilmente il modo migliore di procedere. Forse guardando il codice che implementa / dev / kmem o / dev / rtc [0-9]. Inoltre, i driver seriali implementano i loro driver utilizzando dispositivi a caratteri.

Pensalo come un dispositivo virtuale. : -)

/ proc non è in realtà un vero file system ; è costruito dal kernel in base a ciò che è attualmente in esecuzione. Non penso che tu possa creare pipe con nome in esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top