Poiché il file può essere aperto più volte, quando si chiude un descrittore, solo l'ultima chiamata di chiusura per l'ultimo riferimento al file richiama il rilascio. Quindi c'è una differenza tra chiusura e rilascio.
release:chiamato all'ultima chiusura(2) di questo file, cioè quandofile->f_count raggiunge 0. Anche se definito come ritorno int, il returnvalue è ignorato da VFS (vedi fs/file_table.c:__fput()). altro
Ho avuto una confusione simile. Perreal ha ragione nel dire che il rilascio non viene chiamato quando viene chiamato close. Ecco un estratto dal libro Linux Device Drivers 3rd edition:
int (*flush) (struct file *);
L'operazione flush viene invocata quando un processo chiude la sua copia di un descrittore di file per un dispositivo; dovrebbe eseguire (e attendere) qualsiasi operazione in sospeso sul dispositivo. Questo non deve essere confuso con l'operazione fsync richiesta dai programmi utente. Attualmente, flush viene utilizzato solo nel codice NFS (network file system). Se flush è NULL, semplicemente non viene invocato.
int (*release) (struct inode *, struct file *);
Questa operazione viene richiamata quando la struttura del file viene rilasciata. Come aperto, il rilascio può mancare.
Si noti che release non viene richiamato ogni volta che un processo chiama close. Ogni volta che viene condivisa una struttura di file (ad esempio, dopo un fork o un dup), il rilascio non verrà invocato fino a quando tutte le copie non saranno chiuse. Se hai bisogno di cancellare i dati in sospeso quando una qualsiasi copia viene chiusa, dovresti implementare il metodo flush.