GNU/Linux >> Linux Esercitazione >  >> Linux

Linux – /proc/pid/fd/x Numero di collegamento?

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.

Correlati:Linux – Mostra solo punti di montaggio "interessanti" / filtra i tipi non interessanti?
Linux
  1. In che modo Linux gestisce più separatori di percorsi consecutivi (/home////nomeutente///file)?

  2. Linux – Modificare /proc/pid/environ dopo l'avvio del processo?

  3. Linux:numero di processori in /proc/cpuinfo?

  4. Linux:il significato di Proc//fdinfo/0? Chi lo crea?

  5. Linux – Unire /usr/bin e /usr/sbin in /bin (gnu/linux)?

Una guida al file system '/proc' in Linux

/proc/cpuinfo e /proc/meminfo in Linux

Che cos'è il file /etc/passwd in Linux?

Comprendere i file /proc/mounts, /etc/mtab e /proc/partitions

sysctl rispetto alla scrittura diretta su /proc/*

È sbagliato collegare /dev/random a /dev/urandom su Linux?