V Linuxu v /proc/PID/fd/X
, odkazy na deskriptory souborů, které jsou kanály nebo sokety, mají číslo, například:
l-wx------ 1 user user 64 Mar 24 00:05 1 -> pipe:[6839]
l-wx------ 1 user user 64 Mar 24 00:05 2 -> pipe:[6839]
lrwx------ 1 user user 64 Mar 24 00:05 3 -> socket:[3142925]
lrwx------ 1 user user 64 Mar 24 00:05 4 -> socket:[3142926]
lr-x------ 1 user user 64 Mar 24 00:05 5 -> pipe:[3142927]
l-wx------ 1 user user 64 Mar 24 00:05 6 -> pipe:[3142927]
lrwx------ 1 user user 64 Mar 24 00:05 7 -> socket:[3142930]
lrwx------ 1 user user 64 Mar 24 00:05 8 -> socket:[3142932]
lr-x------ 1 user user 64 Mar 24 00:05 9 -> pipe:[9837788]
Jako na prvním řádku:6839. Co to číslo představuje?
Přijatá odpověď:
To je číslo inodu příslušné trubky nebo zásuvky.
Roura je jednosměrný kanál se zapisovacím a čtecím koncem. Ve vašem příkladu to vypadá, že FD 5 a FD 6 spolu mluví, protože čísla inodů jsou stejná. (Možná však ne. Viz níže.)
Častější než vidět program mluvit sám se sebou přes rouru je dvojice samostatných programů, které spolu mluví, obvykle proto, že mezi nimi nastavíte rouru pomocí shellu:
shell-1$ ls -lR / | less
Poté v jiném okně terminálu:
shell-2$ ...find the ls and less PIDs with ps; say 4242 and 4243 for this example...
shell-2$ ls -l /proc/4242/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 1 -> pipe:[222536390]
shell-2$ ls -l /proc/4243/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 0 -> pipe:[222536390]
To říká, že standardní výstup PID 4242 (FD 1, podle konvence) je připojen k potrubí s číslem inodu 222536390 a že standardní vstup PID 4243 (FD 0) je připojen ke stejnému potrubí.
To vše je dlouhý způsob, jak říci, že ls
Výstup 's je odesílán na less
'vstup.
Vraťme se k vašemu příkladu, FD 1 a FD 2 téměř jistě ne nejsou mluvit spolu. S největší pravděpodobností je to výsledek spojení stdout (FD 1) a stderr (FD 2) dohromady, takže oba jdou do stejného cíle. Můžete to udělat pomocí Bourne shellu takto:
$ some-program 2>&1 | some-other-program
Pokud jste se tedy pustili do /proc/$PID_OF_SOME_OTHER_PROGRAM/fd
, našli byste třetí FD připojené k potrubí se stejným číslem inodu, jaké je připojeno k FD 1 a 2 pro some-program
instance. To může být také to, co se děje s FD 5 a 6 ve vašem příkladu, ale nemám žádnou hotovou teorii, jak se tyto dva FD spojily. Abyste na to přišli, museli byste vědět, co program interně dělá.