GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum heißt die Close-Funktion im Linux-Kernel in `struct file_operations` release?

Da die Datei mehrere Male geöffnet werden kann, wird beim Schließen eines Deskriptors nur beim letzten Schließaufruf für die letzte Referenz auf die Datei die Freigabe aufgerufen. Es gibt also einen Unterschied zwischen schließen und loslassen.

release:wird beim letzten close(2) dieser Datei aufgerufen, d. h. wenn file->f_count 0 erreicht. Obwohl als int zurückgebend definiert, wird der Rückgabewert von VFS ignoriert (siehe fs/file_table.c:__fput()). mehr


Ich hatte eine ähnliche Verwirrung. Perreal hat recht damit, dass 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 Flush-Operation wird aufgerufen, wenn ein Prozess seine Kopie eines Dateideskriptors für ein Gerät schließt; Es sollte alle ausstehenden Operationen auf dem Gerät ausführen (und darauf 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 open kann release fehlen.

Beachten Sie, dass release nicht jedes Mal aufgerufen wird, wenn ein Prozess close aufruft. Immer wenn eine Dateistruktur geteilt wird (z. B. nach einem Fork oder einem Dup), wird die Freigabe nicht aufgerufen, bis alle Kopien geschlossen sind. Wenn Sie anstehende Daten löschen müssen, wenn eine Kopie geschlossen wird, sollten Sie die Flush-Methode implementieren.


Linux
  1. Herzlichen Glückwunsch an den Linux-Kernel:Was ist Ihre Lieblingsversion?

  2. Der Lebenszyklus des Linux-Kernel-Testens

  3. Linux – Warum heißt die Ethernet-Schnittstelle Enp0s10 statt Eth0?

  4. Linux – Warum ist kein Rootfs-Dateisystem auf dem System vorhanden?

  5. Linux – Enthält der Vmlinux-Header die Länge des Kernel-Images?

Einführung in das Linux-Dateisystem

Ändern Sie die Kernel-Version auf einem Linux-Cloud-Server mithilfe des Rettungsmodus

Wo ist die Itoa-Funktion in Linux?

Warum brauchen wir die .so.1-Datei unter Linux?

Warum gibt pr_debug des Linux-Kernels keine Ausgabe aus?

Warum den Linux-Kernel vor dem Root-Benutzer schützen?