$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty 136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim 64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
/dev
a jeho podadresáře jsou všechny popisovače souborů zařízení?/dev/fd/0
, /dev/stdin
, /proc/self/fd/0
jsou všechny odkazy na /dev/pts/2
.l
v lrwx------
znamená odkaz, co dělá c
v crw--w----
znamenat?Téměř všechny soubory pod /dev
Jsou soubory zařízení . Zatímco čtení a zápis do běžného souboru ukládá data na disk nebo jiný souborový systém, přístup k souboru zařízení komunikuje s ovladačem v jádře, které obvykle zase komunikuje s hardwarem (hardwarové zařízení, odtud název).
Existují dva typy souborů zařízení: bloková zařízení (označená b
jako první znak ve výstupu ls -l
) A znaková zařízení (označená c
). Rozdíl mezi blokovými a znakovými zařízeními není úplně univerzální. Bloková zařízení jsou věci jako disky, které se chovají jako velké soubory s pevnou velikostí: pokud zapíšete bajt na určitém ofsetu a později načtete ze zařízení na tomto ofsetu, dostanete tento bajt zpět. Znaková zařízení jsou téměř o něčem jiném, kde zápis bajtu má nějaký okamžitý účinek (např. Je vysílán na sériové lince) a čtení bajtu má také nějaký okamžitý účinek (např. Je načten ze sériového portu).
Význam souboru zařízení je určen jeho číslem, nikoli názvem (název záleží na aplikacích, ale ne na jádru). Číslo je ve skutečnosti dvě čísla: hlavní číslo označuje, který ovladač je za toto zařízení zodpovědný, a menší číslo umožňuje řidiči řídit několik zařízení¹. Tato čísla se objevují v seznamu ls -l
, Kde byste normálně našli velikost souboru. Např. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ toto zařízení je hlavní 8, menší 0.
Některé soubory zařízení pod /dev
Neodpovídají hardwarovým zařízením. Jeden, který existuje v každém unixovém systému, je /dev/null
; zápis do něj nemá žádný účinek a čtení z něj nikdy nevrací žádná data. Ve skriptech Shell je to často výhodné, když chcete ignorovat výstup z příkazu (>/dev/null
) Nebo spustit příkaz bez vstupu (</dev/null
). Další běžné příklady jsou /dev/zero
(Který vrací nulové bajty infinitum reklamy ) /dev/urandom
( který vrací náhodné bajty nekonečné množství reklamy ).
Několik souborů zařízení má význam, který závisí na procesu, který k němu přistupuje. Například /dev/stdin
Označuje standardní vstup aktuálního procesu; otevření z má přibližně stejný účinek jako otevření původního souboru, který byl otevřen jako standardní vstup procesu. Podobně /dev/tty
Označuje terminál, ke kterému je proces připojen. V Linuxu nejsou dnes /dev/stdin
A přátelé implementováni jako znaková zařízení, ale místo toho jako symbolické odkazy na obecnější mechanismus, který umožňuje odkazovat na každý deskriptor souboru (na rozdíl od pouze 0, 1 a 2 pod tradiční metoda); například /dev/stdin
je symbolický odkaz na /proc/self/fd/0
. Viz Jak se/dev/fd týká/proc/self/fd /? .
Pod symbolem /dev
Najdete několik symbolických odkazů. K tomu může dojít z historických důvodů: soubor zařízení byl přesunut z jednoho jména na druhé, ale některé aplikace stále používají staré jméno. Například /dev/scd0
Je symbolickým odkazem na /dev/sr0
V systému Linux; oba označují první CD zařízení. Dalším důvodem pro symbolické odkazy je organizace: pod Linuxem najdete své pevné disky a diskové oddíly na několika místech: /dev/sda
A /dev/sda1
A přátelé (každý disk je označen libovolným písmenem a oddíly) podle rozložení oddílů), /dev/disk/by-id/*
(disky označené jedinečným sériovým číslem), /dev/disk/by-label/*
(oddíly se souborovým systémem, označeny štítkem zvoleným člověkem); a více. Symbolické odkazy se používají také tehdy, pokud může být obecný název zařízení jedním z několika; například /dev/dvd
může být symbolickým odkazem na /dev/sr0
, nebo by to mohl být odkaz na /dev/sr1
, pokud máte dvě čtečky CD a druhým je výchozí DVD čtenář.
Nakonec existuje několik dalších souborů, které můžete najít pod /dev
, Z tradičních důvodů. Na každém systému nenajdete totéž. Ve většině odvětví je /dev/log
soket , který programy používají k vysílání zpráv protokolu. /dev/MAKEDEV
Je skript, který vytváří položky v /dev
. V moderních systémech Linux jsou položky v /dev/
Vytvářeny automaticky pomocí dev , zastarávající MAKEDEV
.
¹ Ve Linuxu to ve skutečnosti již neplatí, ale tento detail záleží pouze na spisovatelích ovladačů zařízení.
/dev/
Je./dev/stdin
. Toto neznamená bod staticky na /dev/pts/2
Nebo jakoukoli jiný - stačí přejít na jiný terminál a uvidíte. /dev/stdin
Je standardní vstup vaší aktuální relace terminálu. To je také příklad, proč to musí být symbolický odkaz.man mknod
A info coreutils 'mknod invocation'
. Obecně platí, že c
znamená typ zařízení s charakteristickými znaky.Pro vaši první otázku nejde o popisovače souborů, ale o soubory zařízení. (a.k.a. „dev uzly“)
Tyto soubory jsou svázány s ovladačem, který pracuje se zařízením pomocí velkých a menších čísel. (Například „136, 2“ ve vašem výstupu ls
odkazuje na ovladač zařízení vázaný na hlavní číslo 136 a určuje zařízení # 2 zpracované tímto ovladačem.)
První písmeno výstupu ls -l
je typ zařízení v případě souborů zařízení. Pokud je to „c“, jedná se o znakové zařízení, nebo pokud je „b“, jedná se o blokové zařízení.
Pro vaši druhou otázku použijte výše uvedenou odpověď rozcietrzewiacz.