Vždy mě to zajímalo, ale nikdy jsem si nenašel čas na to, abych to zjistil, takže tak učiním nyní – jak přenosné je zde uvedené použití buď /proc/$$/fd/$N
nebo /dev/fd/$N
? Chápu, že POSIX zaručuje /dev/null, /dev/tty, and /dev/console
(i když jsem to zjistil až druhý den po přečtení komentářů k této odpovědi) ale co tito ostatní?
Pokud mohu říci, jsou docela běžné, ale v jakých systémech ne očekávat, že je najdeme? Proč ne? Je pravděpodobnější, že se najde jedno než druhé? Budou vždy vykazovat podobné atributy?
Mám tendenci tato zařízení používat ve velké míře všemi způsoby a rád bych věděl, jestli existuje šance, že bych to jen zkusil.
Také výše uvedené otázky by měly být chápány pouze jako to, co si myslím Rád bych to věděl, ale protože se samozřejmě musím ptát na prvním místě, možná v tomto ohledu nevím nejlépe a neměly by být považovány za přísné požadavky na odpověď. Pokud můžete, vysvětlete mi to, prosím.
Přijatá odpověď:
/proc/PID/fd/NUM
symbolické odkazy jsou na Linuxu kvaziuniverzální, ale nikde jinde neexistují (kromě Cygwinu, který je emuluje). /proc/PID/fd/NUM
existují také na AIX a Solaris, ale nejsou to symbolické odkazy. Přenosné, chcete-li získat informace o otevřených souborech, nainstalujte lsof
.
Unices s /proc/PID/fd
Linux
V systému Linux /proc/PID/fd/NUM
je lehce magický symbolický odkaz na soubor, který zpracovává s ID PID má otevřeno v deskriptoru souboru NUM . Tento odkaz je kouzelný v tom, že jej lze například použít pro přístup k souboru, i když je soubor odstraněn. Odkaz bude sledovat soubor také prostřednictvím přejmenování. /proc/self
je magický symbolický odkaz, který ukazuje na /proc/PID
kde PID je proces, který přistupuje k odkazu.
Tato funkce je přítomna prakticky na všech systémech Linux. Poskytuje jej ovladač pro souborový systém proc, který je technicky volitelný, ale používá se pro mnoho věcí (včetně vytváření ps
práce — čte se z /proc/PID
), který není téměř nikdy opomenut ani na vestavěných systémech.
Cygwin
Cygwin emuluje /proc/PID/fd/NUM
(pro procesy Cygwin) a /proc/self
.
Solaris (od verze 2.6), AIX
Existují /proc/PID/fd
záznamy pro každý deskriptor souboru, ale zobrazují se jako stejný typ jako otevřený soubor, takže neposkytují žádné informace o cestě k souboru. Hlásí však stejný stat
informace jako fstat
by se hlásilo procesu, který má soubor otevřený, takže je možné určit, na kterém souborovém systému je soubor umístěn a jeho číslo inodu. Adresáře se zobrazují jako symbolické odkazy, ale jsou to magické symbolické odkazy, které lze pouze sledovat, a readlink
vrátí prázdný řetězec.
V systému AIX, procfiles
zobrazí některé informace o otevřených souborech procesu. V systému Solaris, pfiles
zobrazí některé informace o otevřených souborech procesu. To nezahrnuje cestu k souboru (na Solarisu od verze Solaris 10 ano, viz níže).
Solaris (od verze 10)
Kromě /proc/PID/fd/NUM
, moderní verze systému Solaris mají /proc/PID/path/NUM
který obsahuje symbolické odkazy podobné symbolickým odkazům Linuxu v /proc/PID/fd/NUM
. Soubory pfiles
příkaz zobrazuje informace o otevřených souborech procesu, včetně cest.
Plán9
/proc/PID/fd
je textový soubor, který obsahuje jeden záznam (řádek) na deskriptor souboru otevřený procesem. Název souboru zde není sledován.
QNX
/proc/PID/
je adresář, ale neobsahuje žádné informace o deskriptorech souborů.
Unices s /proc
ale žádný přímý přístup k deskriptorům souborů
(Poznámka:někdy je možné získat informace o otevřených souborech procesu procházením jeho obrazu paměti, který je dostupný pod /proc
. Nepovažuji to za „přímý přístup“.)
Unices kde /proc/PID
je soubor
Samotný souborový systém proc začal v UNIX 8. vydání, ale s jinou strukturou, a prošel plánem 9 a zpět k některým unixům. Myslím, že všechny operační systémy s /proc
mít záznam pro každý PID, ale na mnoha systémech je to běžný soubor, nikoli adresář. Následující systémy mají /proc/PID
který je třeba číst pomocí ioctl
:
- Solaris až 2,5
- OSF/1 nyní známý jako Tru64
- IRIX (?)
- SCO (?)
MINIX 3
MINIX 3 má server procfs, který poskytuje několik komponent podobných Linuxu včetně /proc/PID/
adresáře. Neexistuje však žádné /proc/PID/fd
.
FreeBSD
FreeBSD má /proc/PID/
adresáře, ale neposkytují informace o otevřených deskriptorech souborů. (Existuje však /proc/PID/file
což je podobné linuxovému /proc/PID/exe
, který umožňuje přístup ke spustitelnému souboru prostřednictvím symbolického odkazu.)
Procfs FreeBSD je zastaralý.
Unices bez /proc
- HP-UX
- OpenBSD
- NetBSD
- Mac OS X
Informace deskriptoru souboru prostřednictvím jiných kanálů
Zapékací jednotka
fuser
příkaz uvádí procesy, které mají otevřený zadaný soubor nebo soubor otevřený v zadaném bodu připojení. Tento příkaz je standardní (dostupný na všech systémech kompatibilních s XSI, tj. POSIX s rozšířením X/Open System Interface Extension).
Pomocí tohoto nástroje nemůžete přejít z procesu na názvy souborů.
Lsof
Lsof znamená „seznam otevřených souborů“. Jedná se o nástroj třetí strany, který je k dispozici (ale obvykle není součástí výchozí instalace) pro většinu unixových variant. Získávání informací o otevřených souborech je velmi závislé na systému, protože výše uvedená analýza ve vás mohla vzbudit podezření. Správce lsof odvedl práci a spojil to všechno do jediného rozhraní.
Můžete si přečíst FAQ, abyste viděli, s jakými druhy potíží se musí lsof vyrovnat. Na většině unices vyžaduje získání informací o jménech otevřených souborů analýzu datových struktur jádra. Citace z FAQ 3.3 „Proč lsof nehlásí úplné názvy cest?“:
Lsof nemůže získat komponenty názvů cest z mezipaměti názvů jádra následujících dialektů:
- AIX
Pouze linuxové jádro zaznamenává úplné názvy cest ve strukturách, které spravuje o otevřených souborech; místo toho většina jader převádí názvy cest na dublety čísel zařízení a uzlů a používá je pro následné odkazy na soubory, jakmile jsou soubory otevřeny.
Pokud potřebujete analyzovat informace z lsof
's výstupem, nezapomeňte použít -F
režim (jedno pole na řádek), nejlépe -F0
režimu (pole oddělená nulou). Chcete-li získat informace o konkrétním deskriptoru souboru konkrétního procesu, použijte -a
možnost s -p PID
a -d NUM
, např. lsof -a -p 123 -d 0 -F0n
.
/dev/fd/NUM
pro deskriptory souborů aktuálního procesu
Mnoho unixových variant poskytuje proces pro přístup ke svým otevřeným souborům prostřednictvím názvu souboru:otevření /dev/fd/NUM
je ekvivalentní volání dup(NUM)
. Tyto názvy jsou užitečné, když program chce název souboru, ale vy chcete předat již otevřený soubor (např. roura nebo soket); například shelly, které implementují substituci procesů, je používají tam, kde jsou k dispozici (pomocí dočasného pojmenovaného kanálu, kde /dev/fd
není k dispozici).
Kde /dev/fd
existuje, existují také obvykle (vždy?) synonyma (někdy symbolické odkazy, někdy pevné odkazy, někdy magické soubory s ekvivalentními vlastnostmi) /dev/stdin
=/dev/fd/0
, /dev/stdout
=/dev/fd/1
, /dev/stderr
=/dev/fd/2
.
- V systému Linux
/dev/fd
je symbolický odkaz na/proc/self/fd
. - Ve většině UNIC (IRIX, OpenBSD, NetBSD, SCO, Solaris, …), položky v
/dev/fd
jsou znaková zařízení. Obvykle se zobrazují bez ohledu na to, zda je deskriptor souboru otevřený nebo ne, a položky pro deskriptory souborů nad určitý počet nemusí být dostupné. - Pod FreeBSD a OSX poskytuje souborový systém fdescfs dynamický
/dev/fd
adresář, který následuje za otevřenými deskriptory volajícího procesu. Statický/dev/fd
je k dispozici, pokud/dev/fd
není připojeno. - Pod OSF/1 (Tru64),
/dev/fd
je poskytován prostřednictvím fdfs. - Neexistuje žádný
/dev/fd
na AIX nebo HP-UX.