Étant donné que le fichier peut être ouvert plusieurs fois, lorsque vous fermez un descripteur, seul le dernier appel de fermeture pour la dernière référence au fichier appelle release. Il y a donc une différence entre fermer et libérer.
release :appelée lors du dernier close(2) de ce fichier, c'est-à-dire lorsque file->f_count atteint 0. Bien que définie comme renvoyant int, la valeur de retour est ignorée par VFS (voir fs/file_table.c:__fput()). plus
J'ai eu une confusion similaire. Perreal a raison de dire que la version n'est pas appelée lorsque close est appelée. Voici un extrait du livre Linux Device Drivers 3rd edition :
int (*flush) (struct file *);
L'opération de vidage est invoquée lorsqu'un processus ferme sa copie d'un descripteur de fichier pour un périphérique ; il doit exécuter (et attendre) toutes les opérations en cours sur le périphérique. Cela ne doit pas être confondu avec l'opération fsync demandée par les programmes utilisateur. Actuellement, flush est utilisé uniquement dans le code du système de fichiers réseau (NFS). Si flush est NULL, il n'est tout simplement pas appelé.
int (*release) (struct inode *, struct file *);
Cette opération est invoquée lors de la publication de la structure du fichier. Comme ouvert, la version peut être manquante.
Notez que release n'est pas appelé à chaque fois qu'un processus appelle close. Chaque fois qu'une structure de fichier est partagée (par exemple, après un fork ou un dup), la libération ne sera pas invoquée tant que toutes les copies ne seront pas fermées. Si vous devez vider les données en attente lorsqu'une copie est fermée, vous devez implémenter la méthode flush.