Protože soubor může být otevřen vícekrát, když zavřete deskriptor, pouze při posledním volání zavření pro poslední odkaz na soubor vyvolá uvolnění. Je tedy rozdíl mezi uzavřením a uvolněním.
release:volá se při posledním close(2) tohoto souboru, tj. kdyžfile->f_count dosáhne 0. Ačkoli je definováno jako vracení int, návratová hodnota je VFS ignorována (viz fs/file_table.c:__fput()). více
Měl jsem podobný zmatek. Perreal má pravdu v tom, že vydání není voláno, když je voláno close. Zde je výňatek z knihy Linux Device Drivers 3rd edition:
int (*flush) (struct file *);
Operace vyprázdnění je vyvolána, když proces zavře svou kopii deskriptoru souboru pro zařízení; měl by provést (a počkat na) všechny zbývající operace na zařízení. To se nesmí zaměňovat s operací fsync požadovanou uživatelskými programy. V současné době se flush používá pouze v kódu síťového souborového systému (NFS). Pokud má flush hodnotu NULL, jednoduše se nevyvolá.
int (*release) (struct inode *, struct file *);
Tato operace je vyvolána při uvolnění struktury souboru. Stejně jako otevřené může chybět uvolnění.
Všimněte si, že uvolnění není vyvoláno pokaždé, když proces volá zavřít. Kdykoli je sdílená struktura souboru (například po rozvětvení nebo dup), uvolnění nebude vyvoláno, dokud nebudou uzavřeny všechny kopie. Pokud potřebujete vyprázdnit nevyřízená data při zavření jakékoli kopie, měli byste implementovat metodu flush.