GNU/Linux >> Znalost Linux >  >> Linux

Linux – všechno je soubor?

V Linuxu je každá jednotlivá entita považována za SOUBOR. Pokud udělám vim <cd-Name> pak vim otevře obsah adresáře do svého editoru, protože nerozlišuje mezi souborem a adresářem.

Ale dnes jsem při práci narazil na věc, o které jsem zvědavý.

Plánoval jsem otevřít soubor z vnořeného adresáře

vim a/b/c/d/file

Ale místo vim , napsal jsem

 cd a/b/c/d/

a stiskněte TAB dvakrát, ale příkaz zobrazoval pouze dostupný adresář adresáře „d“, nikoli soubory.

Nepoužívejte cd příkaz honor „všechno je soubor “? Nebo mi něco uniká?

Přijatá odpověď:

Vše je soubor “ fráze definuje architekturu operačního systému. To znamená, že vše v systému od procesů, souborů, adresářů, soketů, rour, … je reprezentováno deskriptorem souboru abstrahovaným přes vrstvu virtuálního souborového systému v jádře. Virtuální souborový systém je rozhraní poskytované jádrem. Proto byla fráze opravena na „Všechno je deskriptor souboru “. Sám Linus Torvalds to opravil opět o něco přesněji:„Všechno je proud bajtů “.

Každý „soubor“ má však také vlastníka a oprávnění, která můžete znát z běžných souborů a adresářů. Klasické unixové nástroje jako cat, ls, ps, … se tedy mohou dotazovat na všechny tyto „soubory“ a není třeba vymýšlet další speciální mechanismy, než jen obyčejné staré nástroje, které všechny používají read() systémové volání. Například v rodině operačních systémů Microsoft existuje několik různých read() systémová volání (slyšel jsem asi 15) pro všechny typy souborů a každé z nich je trochu jiné. Když je všechno soubor, pak to nepotřebujete.

Na vaši otázku :Samozřejmě existují různé typy souborů . V linuxu existuje 7 typů souborů. Adresář je jedním z nich. Obslužné programy je však dokážou od sebe odlišit. Například kompletní funkce cd příkaz (když stisknete TAB ) uvádí pouze adresáře, protože stat() systémové volání (viz man 2 stat ) vrací strukturu s polem nazvaným st_mode . Standard POSIX definuje, co může toto pole obsahovat:

       S_ISREG(m)  is it a regular file?
       S_ISDIR(m)  directory?
       S_ISCHR(m)  character device?
       S_ISBLK(m)  block device?
       S_ISFIFO(m) FIFO (named pipe)?
       S_ISLNK(m)  symbolic link? (Not in POSIX.1-1996.)
       S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

cd funkce dokončení příkazu pouze zobrazí „soubory“, kde je S_ISDIR příznak je nastaven.

Související:Linux – Zakázání služeb vbox pro zkrácení doby spouštění?
Linux
  1. Jak přesunout soubor v Linuxu

  2. Základy oprávnění k souborům Linux

  3. Jak přejmenovat soubor v Linuxu?

  1. Vysvětlení oprávnění souborů v systému Linux

  2. Linux Tail Command

  3. Linux Touch Command

  1. Cat Command v Linuxu

  2. Příkaz souboru Linux

  3. Jak vytvořit soubor v Linuxu