Unter Linux in /proc/PID/fd/X
, die Links für Dateideskriptoren, die Pipes oder Sockets sind, haben eine Nummer, wie:
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]
Wie in der ersten Zeile:6839. Was repräsentiert diese Zahl?
Akzeptierte Antwort:
Das ist die Inode-Nummer für das betreffende Rohr oder die fragliche Muffe.
Eine Pipe ist ein unidirektionaler Kanal mit einem Schreibende und einem Leseende. In Ihrem Beispiel sieht es so aus, als würden FD 5 und FD 6 miteinander sprechen, da die Inode-Nummern gleich sind. (Vielleicht aber nicht. Siehe unten.)
Häufiger als zu sehen, wie ein Programm über eine Pipe mit sich selbst kommuniziert, ist ein Paar separater Programme, die miteinander kommunizieren, typischerweise weil Sie mit einer Shell eine Pipe zwischen ihnen einrichten:
shell-1$ ls -lR / | less
Dann in einem anderen Terminalfenster:
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]
Dies besagt, dass der Standardausgang von PID 4242 (FD 1, per Konvention) mit einer Pipe mit der Inode-Nummer 222536390 verbunden ist und dass der Standardeingang von PID 4243 (FD 0) mit derselben Pipe verbunden ist.
All das ist eine lange Art zu sagen, dass ls
Die Ausgabe wird an less
gesendet Eingabe.
Zurück zu Ihrem Beispiel:FD 1 und FD 2 sind es mit ziemlicher Sicherheit nicht miteinander sprechen. Höchstwahrscheinlich ist dies das Ergebnis der Verknüpfung von stdout (FD 1) und stderr (FD 2), sodass beide zum selben Ziel gelangen. Sie können das mit einer Bourne-Shell wie dieser tun:
$ some-program 2>&1 | some-other-program
Wenn Sie also in /proc/$PID_OF_SOME_OTHER_PROGRAM/fd
herumgestöbert haben , finden Sie einen dritten FD, der an eine Pipe mit der gleichen Inode-Nummer angehängt ist, wie sie an die FDs 1 und 2 für some-program
angehängt ist Beispiel. Dies könnte auch mit den FDs 5 und 6 in Ihrem Beispiel passieren, aber ich habe keine fertige Theorie, wie diese beiden FDs miteinander verbunden wurden. Sie müssten wissen, was das Programm intern tut, um das herauszufinden.