GNU/Linux >> Znalost Linux >  >> Linux

Přenositelnost odkazů na deskriptor souboru?

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.

Související:Extrahovat název souboru z cesty v programu awk?

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.
Související:Je možné získat znak na terminálovém kurzoru pomocí únikových kódů ANSI?
Linux
  1. Vysvětlení pevných odkazů a měkkých odkazů v Linuxu

  2. Echo To File Descriptor přepíše soubor?

  3. Správa duplicitní úlohy Cron při spouštění skriptů

  1. Načíst název souboru z deskriptoru souboru v C

  2. Jak fungují limity linuxových deskriptorů?

  3. Linuxová recyklace PID

  1. Znovu otevřít deskriptor souboru s jiným přístupem?

  2. Jenkins je mrtvý, ale soubor pid existuje

  3. Nejbezpečnější způsob, jak vynutit uzavření deskriptoru souboru