Sous Linux, dans /proc/PID/fd/X
, les liens pour les descripteurs de fichiers qui sont des canaux 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. Que représente ce nombre ?
Réponse acceptée :
C'est le numéro d'inode du tube ou de la prise en question.
Un tube est un canal unidirectionnel, avec une extrémité d'écriture et une extrémité de lecture. Dans votre exemple, il semble que FD 5 et FD 6 se parlent, puisque les numéros d'inode sont les mêmes. (Peut-être pas, cependant. Voir ci-dessous.)
Plus courant que de voir un programme se parler via un tube, c'est une paire de programmes séparés qui se parlent, généralement parce que vous configurez un tube entre eux avec un shell :
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 indique que la sortie standard du PID 4242 (FD 1, par convention) est connectée à un tuyau avec le numéro d'inode 222536390, et que l'entrée standard du PID 4243 (FD 0) est connectée au même tuyau.
Tout cela est une longue façon de dire que ls
La sortie de est envoyée à less
l'entrée.
Pour en revenir à votre exemple, FD 1 et FD 2 ne sont presque certainement pas se parler. C'est très probablement le résultat de lier stdout (FD 1) et stderr (FD 2) ensemble, de sorte qu'ils vont tous les deux vers la même destination. Vous pouvez le faire avec un shell Bourne comme celui-ci :
$ some-program 2>&1 | some-other-program
Donc, si vous fouiniez dans /proc/$PID_OF_SOME_OTHER_PROGRAM/fd
, vous trouverez un troisième FD attaché à un tube avec le même numéro d'inode que celui attaché aux FD 1 et 2 pour le some-program
exemple. C'est peut-être aussi ce qui se passe avec les FD 5 et 6 dans votre exemple, mais je n'ai pas de théorie prête sur la façon dont ces deux FD se sont liés. Vous devez savoir ce que le programme fait en interne pour comprendre cela.