GNU/Linux >> Znalost Linux >  >> Linux

Linux – /proc/pid/fd/x Číslo odkazu?

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á.

Související:Linux – Zobrazují se pouze „zajímavé“ přípojné body / filtrování nezajímavých typů?
Linux
  1. Jak získám cestu k procesu v Unixu / Linuxu

  2. linux /proc/loadavg

  3. Jak dekódovat položky /proc/pid/pagemap v Linuxu?

  1. Kdy mám použít /dev/shm/ a kdy /tmp/?

  2. sysctl vs zápis přímo do /proc/*

  3. Je špatné propojit /dev/random s /dev/urandom v Linuxu?

  1. Prozkoumání souborového systému Linux /proc

  2. Linux – Změnit /proc/pid/environ po spuštění procesu?

  3. Linux – propojení /proc/mnt s /proc/mounts?