Problem bei open() und close() (Verständnisfrage)
-
Hallo,
ich schreibe grad ein virtuelles Filesystem mit FUSE und habe da ein Problem bei der open() und close() bzw. flush() Methode.
Bisher macht meine überschriebene open-Methode nichts anderes als "open()" auszuführen, den return-Wert vom open() und Dateinamen in eine log-Datei zu speichern.
Genauso auch die flush()-Methode.
Diese schreibt nur in das log_file die filedeskriptor-Nummer, welche übergeben wurde.Um zu testen, wie das funktioniert, habe ich also das FS gemounted, und per Konsole eine Datei im emacs geöffnet, welche im virt. FS gemounted war.
Im log erscheint dann folgendes:
open: dateiname: /wasa1/file1 fd: 8 errno: 0 close: fd: 9
Warum wird direkt nach dem Öffnen die flush()-Methode aufgerufen?
Wenn ich 2 mal die gleiche Datei öffne, bleibt die fd-Nr übrigens gleich und errno wird auf 2 gesetzt, d.h. ja, dass die Datei nicht gefunden werden konnte.
Warum? Es ist doch genau die gleiche Datei, die ich öffne.Noch ne Frage: Wenn ich dem emacs jetzt schließe, welche Methode wird dann dafür aufgerufen?
Ich bin da wirklich ratlos
Im Endeffekt ist mein Plan folgender, warum ich das ganze mache:
Ich möchte in einem dynamischen Array speichern, welche Dateien momentan geöffnet sind. Die Einträge des Arrays sind eine Struktur, welche den Dateinamen und ein Array mit allen filedeskriptoren enthalten.
Sobald eine Datei geöffnet wird, wird die in dieses Array hinzugefügt (entweder neu angelegt oder nur einen weiteren fd-Eintrag).
Wenn die Datei geschlossen wird, soll dieser Eintrag wieder aus der Liste entfernt werden.
Sinn und Zweck: Es ist wichtig, dass ich sehen kann, welche Datei gerade noch geöffnet ist, und welche nicht (ich benötige den absoluten Dateipfad der geöffneten Datei, nicht nur die fd-Nummer).
Wenn also jemand da eine viel einfacherere Lösung hat, bin ich noch dankbarer.
-
Hm, ok, dann stell ich meine Frage anders:
Gibt es eine Möglichkeit in C, offene Prozesse anzeigen zu lassen? Dabei brauche ich aber nicht die file-descriptor-nummern, sondern den Dateipfad.
Quasi sowas wie lsof für Linux, nur ich brauch das in C.
-
Fabulus schrieb:
Sinn und Zweck: Es ist wichtig, dass ich sehen kann, welche Datei gerade noch geöffnet ist, und welche nicht (ich benötige den absoluten Dateipfad der geöffneten Datei, nicht nur die fd-Nummer).
Wenn also jemand da eine viel einfacherere Lösung hat, bin ich noch dankbarer.lsof (8) dürfte die allereinfachste Lösung sein.
Um zu sehen was für syscalls emacs zu welchem Zeitpunkt macht, würde ich emacs mit strace starten:
$ strace -e trace=file emacs
-
Ja, lsof ist mir bekannt. Gibt es denn so eine Funktion auch in C, die quasi das gleiche macht? Mir ist dies nämlich nicht bekannt und durch Suche bin ich nur auf Funktonen gestoßen, die einen Filedeskriptor brauchen oder zurückgeben, aber nie die Dateipfade.
-
Fabulus schrieb:
Ja, lsof ist mir bekannt. Gibt es denn so eine Funktion auch in C, die quasi das gleiche macht?
Laut strace geht lsof den manuellen Weg, indem es /proc von vorne bis hinten durchsucht. Wenn es einen eleganteren Weg geben würde, würde lsof den wahrscheinlich verwenden.