GNU/Linux >> Znalost Linux >  >> Linux

Proč se funkce zavření nazývá release v `struct file_operations` v jádře Linuxu?

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.


Linux
  1. Linux – Proč se ethernetové rozhraní nazývá Enp0s10 namísto Eth0?

  2. Linux – Proč v systému není přítomen žádný souborový systém Rootfs?

  3. Linux – Obsahuje hlavička Vmlinux délku obrazu jádra?

  1. Kde je hlavičkový soubor <conio.h> v systému Linux? Proč nemohu najít <conio.h>?

  2. Proč potřebujeme soubor .so.1 v Linuxu?

  3. Proč pr_debug linuxového jádra nedává žádný výstup?

  1. Proč „sshpass“ není správný způsob automatizace přenosů souborů v Linuxu

  2. Linux – Proč nemůže jádro spustit inicializaci?

  3. Proč se nejvýkonnější uživatel v systému Unix/Linux nazývá „root“?