In Linux, in /proc/PID/fd/X
, i collegamenti per descrittori di file che sono pipe o socket hanno un numero, ad esempio:
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 sulla prima riga:6839. Che cosa rappresenta quel numero?
Risposta accettata:
Questo è il numero di inode per il tubo o la presa in questione.
Una pipe è un canale unidirezionale, con un'estremità di scrittura e un'estremità 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, però. Vedi sotto.)
Più comune che vedere un programma che parla da solo su una pipe è una coppia di programmi separati che parlano tra loro, in genere perché si imposta una pipe tra di 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]
Questo dice 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 per dire che ls
L'output viene inviato a less
's input.
Tornando al tuo esempio, FD 1 e FD 2 sono quasi certamente non parlando tra di loro. Molto probabilmente questo è il risultato dell'unione di stdout (FD 1) e stderr (FD 2), quindi entrambi vanno alla stessa destinazione. Puoi farlo con una shell Bourne come questa:
$ some-program 2>&1 | some-other-program
Quindi, se hai dato un'occhiata in /proc/$PID_OF_SOME_OTHER_PROGRAM/fd
, troverai un terzo FD collegato a una pipe con lo stesso numero di inode allegato agli FD 1 e 2 per il some-program
esempio. Questo potrebbe anche essere ciò che sta accadendo con le FD 5 e 6 nel tuo esempio, ma non ho una teoria pronta su come queste due FD siano state legate insieme. Dovresti sapere cosa sta facendo il programma internamente per capirlo.