2012-07-09 2 views
9

Ich versuche, ein Linux-Kernel-Modul zu machen, das Öffnen, Schließen, Lesen und Schreiben unterstützt. Also möchte ich diese Funktionen über die Struktur file_operations registrieren, aber ich kann 'schließen' Eintrag in der Struktur nicht finden. Ich denke, ich sollte 'release' statt 'close' verwenden, aber ich frage mich, warum der Name 'release' und nicht 'close' ist?Warum heißt die Close-Funktion in `struct file_operations` im Linux-Kernel release?

+0

Sie fragen also, warum es "Release" und nicht "Close" heißt? – cnicutar

+0

Ja, ich habe den Titel repariert. –

Antwort

11

Da die Datei beim Schließen eines Deskriptors mehrmals geöffnet werden kann, wird nur beim letzten Schließungsaufruf für den letzten Verweis auf die Datei die Freigabe ausgelöst. Es gibt also einen Unterschied zwischen Close und Release.

Release: am letzten Schließen genannt (2) der Datei, dh wenn File-> f_count 0 erreicht zwar als Rückkehr int definiert, die Rückkehr Wert von VFS (siehe fs/file_table ignoriert. c: __ fput()).

+2

Beachten wir auch, dass mmap Verweis auf eine Datei so erhöht; open, mmap, close sequence führt nicht dazu, dass release sofort aufgerufen wird, sondern wenn munmap aufgerufen wird. – auselen

4

Ich hatte eine ähnliche Verwirrung. Perreal ist korrekt, wenn Release nicht aufgerufen wird, wenn close aufgerufen wird. Hier ist ein Auszug aus dem Buch Linux Device Drivers 3rd edition:

int (*flush) (struct file *); 

Die Räum-Operation aufgerufen wird, wenn ein Prozess schließt seine Kopie eines Dateideskriptor für eine Vorrichtung; Es sollte alle ausstehenden Operationen auf dem Gerät ausführen (und warten). Dies darf nicht mit der von Benutzerprogrammen angeforderten fsync-Operation verwechselt werden. Derzeit wird Flush nur im NFS-Code (Network File System) verwendet. Wenn Flush NULL ist, wird es einfach nicht aufgerufen.

int (*release) (struct inode *, struct file *); 

Diese Operation wird aufgerufen, wenn die Dateistruktur freigegeben wird. Wie offen, Release kann fehlen.

Beachten Sie, dass die Freigabe nicht bei jedem Aufruf eines Prozesses aufgerufen wird. Wenn eine Dateistruktur freigegeben wird (z. B. nach einer Verzweigung oder einem Duplikat), wird die Freigabe nicht aufgerufen, bis alle Kopien geschlossen sind. Wenn Sie ausstehende Daten beim Schließen einer Kopie leeren müssen, sollten Sie die Flush-Methode implementieren.

+1

Wenn ein einzelner Prozess zwei Dateideskriptoren hat, die sich auf die gleiche Datei beziehen, ruft das Aufrufen von 'close()' auf jedem Dateideskriptor zweimal 'release' auf. – Asblarf

+1

@Asblarf Das ist sinnvoll, da für jeden von einem Prozess geöffneten Dateideskriptor ein separates "struct file *" - Objekt im Kernel erhalten bleibt. –

+0

Genau das habe ich herausgefunden, indem ich genauer betrachtet habe, was 'struct file *' darstellt. – Asblarf