proc datei editieren
-
Hallo ich habe ein kleines Kernelmodul geschrieben welches im /proc verzeichnis eine Datei anlegt.
procfile=create_proc_entry("meinedatei.cfg", S_IRUGO | S_IWUGO, NULL);
Ich möchte gerne in mein Kernelmodul eine Konfigurationsdatei einlesen und da dachte ich mir es würde sich am einfachsten über das Proc-Filesystem lösen lassen. Also erzeugt mein Kernelmodul diese Datei unter /proc.
Diese Datei existert auch solange das Modul geladen ist. Jetzt möchte ich gerne aus dem Userspace diese Datei mit Inhalt füllen aber das klappt leider nicht.
Habe es per
echo "Test bla bla" > meinedatei.cfg
versucht, jedoch wenn ich anschließend die Datei per vi öffne ist sie leer.
Kann mir einer bitte sagen, was ich falsch mache?
Thx.
-
die dateien in proc sind eine normalen dateien, die benötigen erst funktionen, die das lesen/schreiben vom/zum userspace behandeln
-
Hallo r0nny,
meinst Du (k)eine normalen Dateien?
die dateien in proc sind eine normalen dateien
Aber ich kann doch z.B. in /proc/sys/net/ipv4/ip_forward beliebig per
echo 1 > ip_forward
den Wert auf 1 setzen oder wieder zurück auf 0.
Was ist denn nötig, damit ich auch in meine Datei schreiben kann? Gibt es evtl. einen Befehl, ein Stichwort dafür, so dass ich das auch selbst bei Google nachschlagen kann?
thx
-
beschreibt es ganz ok :http://www.tldp.org/LDP/lkmpg/2.6/html/x769.html
war übringens der 2.treffer bei google for proc file writing
-
Hallo,
danke für deine Antwort. Habe jetzt die Funktionen zum Lesen und Schreiben implementiert. Ich kann jetzt mit echo ... die Datei mit Inhalt füllen. Jedoch stelle ich mir nun die Frage, wie ich diese Datei mit dem Kernel Modul richtig auslese?
Ich habe es ganz plump erst mal so probiert:
printk("Test: %s \n", &procfile) ;
Dies hat zuerst funktioniert, nur dass das erste Zeichen immer gefehlt hat. Nun funktioniert es aber irgendwie nicht mehr. Kommt nur noch Test auf dem Bildschirm.
Muss ich, um die Datei mit dem Kernelmodul auszulesen, auch die read-funktion benutzen?
Ich denke Du merkst schon, dass ich nicht gerade der C Profi bin. Bin daher für jede Hilfe dankbar!
-
Auf der Seite steht doch was passiert wenn ins procfile geschrieben wird. Du sollst in der dafür vorgesehenen Funktion die Daten dann auswerten! Im Kernelspace ist das keine Datei die Du lesen oder schreiben kannst. Wenn sie im Userspace jemand liest oder schreibt, werden die entsprechenden Funktionen Deines Treibers aufgerufen...
-
Ui Ui Ui,
danke für die Antwort. Hast recht steht alles dort beschrieben. Man muss nur lesen können
Habe aus
printk("Test: %s \n", &procfile);
Das hier gemacht:
printk("Test: %s \n", procfs_buffer);
gemacht.
Und siehe da es geht!
DANKE!
-
Hallo,
ich hätte da noch eine Frage zur Proc-Datei. Ich kann jetzt wunderbar per echo "bla" >> procfile.txt in die Datei schreiben.
Jetzt wollte ich gerne mehrere Zeilen in die Datei schreiben, aber das klappt nicht. Es bleibt immer nur die letzte Zeile in der Proc-Datei.
Habe es auf zwei Wegen probiert:
1)
echo "bla1" >> procfile.txt
echo "bla2" >> procfile.txtecho -e "bla1\nbla2\n" >> procfile.txt
Beides führt nicht zum gewünschten Effekt. Im ersten Fall bleibt nur der letzte Eintrag in der Datei; Beim zweiten Fall ist die Datei leer. Scheinbar wegen dem letzten Zeilenumbruch.
Was muss ich tun, damit ich mehrere Zeilen Text in die Datei bekomme?
Danke.
-
die lese/schreibfunktion der proc-datei ändern ?
und unbedingt irgendwo zwischenspeichern...
-
slayer977 schrieb:
Was muss ich tun, damit ich mehrere Zeilen Text in die Datei bekomme?
Aus dem Procfile kommt das raus was Du in der procfile_read Funktion des Treibers absetzt. Wenn Du willst dass da zwei Zeilen rauskommen, dann speicher halt zwei Zeilen, und gib zwei Zeilen aus. Nochmal: Das ist keine Datei, sondern eine Schnittstelle zwischen Treiber und Userland!
-
ok, danke. Werde es dann wohl doch als ein echo input belassen. wollte es eigentlich nur aus ästhetischen Gründen machen. pro zeile ein input befehl für mein kernel modul, aber ich nehme eh das Semikolon als Trennzeichen zwischen einzelnen Befehlen. Von daher egal.
Danke noch mal.