/ proc / PID / fd / X numero di collegamento


36

In Linux, in /proc/PID/fd/X, i collegamenti per i descrittori di file che sono pipe o socket hanno un numero, come:

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]

Come nella prima riga: 6839. Cosa rappresenta quel numero?

Risposte:


36

Questo è il numero di inode per la pipe o il socket in questione.

Una pipe è un canale unidirezionale, con una fine di scrittura e una fine di lettura. Nel tuo esempio, sembra che FD 5 e FD 6 stiano parlando tra loro, poiché i numeri di inode sono gli stessi. (Forse no, comunque. Vedi sotto.)

Più comune di vedere un programma parlare da solo su una pipe è una coppia di programmi separati che parlano tra loro, in genere perché si imposta una pipe tra loro con una shell:

shell-1$ ls -lR / | less

Quindi in un'altra finestra del terminale:

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]

Ciò afferma che l'uscita standard del PID 4242 (FD 1, per convenzione) è collegata a un tubo con numero di inode 222536390 e che l'ingresso standard del PID 4243 (FD 0) è collegato allo stesso tubo.

Tutto ciò è un lungo modo di dire che lsl'output viene inviato aless all'input.

Tornando al tuo esempio, FD 1 e FD 2 quasi sicuramente non parlano tra loro. Molto probabilmente questo è il risultato di legare insieme stdout (FD 1) e stderr (FD 2), quindi entrambi vanno nella stessa destinazione. Puoi farlo con una shell Bourne come questa:

$ some-program 2>&1 | some-other-program

Quindi, se ti guardassi dentro /proc/$PID_OF_SOME_OTHER_PROGRAM/fd, troverai un terzo FD collegato a una pipe con lo stesso numero di inode collegato agli FD 1 e 2 per l' some-programistanza. Questo potrebbe anche essere ciò che sta accadendo con gli FD 5 e 6 nel tuo esempio, ma non ho una teoria pronta su come questi due FD siano stati uniti. Dovresti sapere cosa sta facendo il programma internamente per capirlo.


1
L'esempio, credo, era pidgin: aveva un sacco di tubi e prese e altre cose, quindi è stato un buon esempio. Un'ultima domanda: gli inode sono specifici solo nel contesto di un particolare filesystem, giusto? Come in, avrei potuto avere l'inode 3 sul mio /filesystem e un altro (diverso) inode 3 sul mio /bootfilesystem.
Thanatos,

4
Sì. Nel caso del /procfilesystem, i numeri di inode sono semplicemente inventati al volo (vedi get_next_ino()nel fs/inode.ckernel), a partire da 0 quando il sistema viene appena avviato. Il meccanismo che li compone è condiviso da molti dei filesystem impersistenti di Linux (proc, configfs, ramfs, autofs ...) tra i quali i numeri di inode sono unici anche se la semantica POSIX non lo richiede. Questo è un caso piuttosto speciale, tuttavia. La regola di cui stai parlando è generalmente referenziata in relazione a normali filesystem persistenti come ext3.
Warren Young,

33

Per i socket puoi trovare maggiori informazioni sull'inode in /proc/net/tcp, /proc/net/udpo /proc/net/unix. Per esempio:

ls -l /proc/<pid>/fd
lrwx------ 1 root root 64 May 26 22:03 3 -> socket:[53710569]

Vediamo che l'inode è 53710569.

head -n1 < tcp ; grep -a 53710569 tcp
sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                   
155: 0100007F:001B 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0        0 53710569 1 ffff88011f52c200 300 0 0 2 -1

In questo caso, questo è un socket di ascolto (nessun indirizzo remoto), in ascolto sulla porta locale 27 (0x1B). Gli indirizzi IP sono 4 byte in esadecimale in "notazione di rete", è possibile utilizzareinet_ntoa funzione per convertirlo in notazione abcd standard (127.0.0.1 in questo caso).

Nota che questi file sembrano essere 0 byte ma hanno contenuto se li leggi. Si noti inoltre che -aè richiesto con grep poiché possono (ad es. Con unix) sembrare binari.


C'è anche /proc/net/tcp6e /proc/net/udp6per IPv6.
Craig McQueen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.