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.