À Linux, en /proc/PID/fd/X
, les liens des descripteurs de fichier qui sont des tuyaux ou des sockets ont un numéro, comme:
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]
Comme sur la première ligne: 6839. Quel est ce nombre représentant?
C'est le numéro inode pour le tuyau ou la prise en question.
Un tuyau est un canal unidirectionnel, avec une extrémité d'écriture et une fin de lecture. Dans votre exemple, il ressemble à FD 5 et FD 6 se parlent les uns aux autres, car les numéros d'inode sont les mêmes. (Peut-être pas, cependant. Voir ci-dessous.)
Plus courant que de voir un programme parlant à lui-même sur un tuyau est une paire de programmes distincts qui se parlent, généralement parce que vous avez mis en place un tuyau entre eux avec une coquille:
Shell-1$ ls -lR / | less
Puis dans une autre fenêtre de terminal:
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]
Cela dit que la sortie standard de PID 4242 (FD 1, par convention) est connectée à un tuyau avec Numéro d'inode 22536390 et que l'entrée standard de PID 4243 (FD 0) est connectée au même tuyau.
Tout ce qui est un long moyen de dire que la sortie ls
est envoyée à l'entrée less
.
Revenir à votre exemple, FD 1 et FD 2 sont presque certainement non parler les uns aux autres. Très probablement, c'est le résultat de la noix de stdout (FD 1) et de STDERR (FD 2) ensemble, alors ils vont tous les deux à la même destination. Vous pouvez le faire avec une coquille de Bourne comme ceci:
$ some-program 2>&1 | some-other-program
Donc, si vous avez piqué dans /proc/$PID_OF_SOME_OTHER_PROGRAM/fd
, vous trouverez une troisième FD attachée à un tuyau avec le même numéro d'inode que celui attaché aux FDS 1 et 2 pour le some-program
exemple. Cela peut également être ce qui se passe avec les FDS 5 et 6 de votre exemple, mais je n'ai aucune théorie prête à laquelle ces deux FDS ont été liés ensemble. Vous devriez savoir ce que le programme fait en interne pour comprendre cela.
Pour les sockets, vous pouvez trouver plus d'informations sur l'inode dans /proc/net/tcp
, /proc/net/udp
ou /proc/net/unix
. Par exemple:
ls -l /proc/<pid>/fd
lrwx------ 1 root root 64 May 26 22:03 3 -> socket:[53710569]
Nous voyons l'inode est 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
Dans ce cas, il s'agit d'une prise d'écoute (pas d'adresse distante), à l'écoute du port local 27 (0x1b). Les adresses IP sont de 4 octets en hexagonale dans "Notation de réseau", vous pouvez utiliser inet_ntoa
fonction de la convertir en notation standard A.B.C.D (127.0.0.1 dans ce cas).
Notez que ces fichiers semblent être 0 octets mais avoir du contenu si vous les lisez. Notez également que -a
est requis avec GREP car ils le peuvent (par exemple avec unix
) semblent être binaires.