/ proc / PID / fd / X Verbindungsnummer

36

Unter Linux haben /proc/PID/fd/Xdie Links für Dateideskriptoren, die Pipes oder Sockets sind, 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?

Thanatos
quelle

Antworten:

36

Dies ist die Inode- Nummer für das betreffende Rohr oder die betreffende 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 ein Programm zu sehen, das über eine Pipe mit sich selbst kommuniziert, sind zwei separate Programme, die miteinander kommunizieren. Dies liegt normalerweise daran, dass Sie eine Pipe mit einer Shell 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, gemäß Konvention) mit einer Leitung mit der Inode-Nummer 222536390 verbunden ist und dass der Standardeingang von PID 4243 (FD 0) mit derselben Leitung verbunden ist.

All dies ist ein langer Weg zu sagen, dass lsdie Ausgabe an lessdie Eingabe gesendet wird .

Zurück zu Ihrem Beispiel: FD 1 und FD 2 sprechen mit ziemlicher Sicherheit nicht miteinander. Dies ist höchstwahrscheinlich das Ergebnis der Verknüpfung von stdout (FD 1) und stderr (FD 2), sodass beide zum gleichen Ziel gelangen. Sie können dies mit einer Bourne-Shell wie folgt tun:

$ some-program 2>&1 | some-other-program

Wenn Sie sich also umsehen /proc/$PID_OF_SOME_OTHER_PROGRAM/fd, finden Sie ein drittes FD, das an eine Pipe mit derselben Inode-Nummer angehängt ist, die für die some-programInstanz an FDs 1 und 2 angehängt ist . Dies mag auch das sein, was in Ihrem Beispiel mit den FDs 5 und 6 passiert, aber ich habe keine fertige Theorie, wie diese beiden FDs miteinander verbunden wurden. Sie müssen wissen, was das Programm intern tut, um das herauszufinden.

Warren Young
quelle
1
Das Beispiel, denke ich, war pidgin- es hatte eine Menge Rohre und Steckdosen und anderes Zeug, also war es ein schönes Beispiel. Eine letzte Frage: Inodes sind nur im Kontext eines bestimmten Dateisystems spezifisch, richtig? Wie in könnte ich Inode 3 in meinem /Dateisystem und einen anderen (anderen) Inode 3 in meinem /bootDateisystem haben.
Thanatos
4
Ja. Im Falle des /procDateisystems werden die Inode-Nummern einfach im laufenden Betrieb gebildet (siehe get_next_ino()im fs/inode.cKernel), beginnend mit 0, wenn das System neu gestartet wird. Der Mechanismus, der sie macht wird von mehreren Linux impersistent Dateisystemen geteilt (proc, configfs, ramfs, autofs ...) , unter denen Inode - Nummern sind einzigartig , obwohl POSIX Semantik es nicht verlangen. Das ist jedoch ein ganz besonderer Fall. Die Regel, von der Sie sprechen, wird normalerweise in Verbindung mit normalen persistenten Dateisystemen wie ext3 verwendet.
Warren Young
33

Für Sockets finden Sie weitere Informationen zur Inode in /proc/net/tcp, /proc/net/udpoder /proc/net/unix. Beispielsweise:

ls -l /proc/<pid>/fd
lrwx------ 1 root root 64 May 26 22:03 3 -> socket:[53710569]

Wir sehen, Inode ist 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

In diesem Fall handelt es sich um einen Listening-Socket (keine Remote-Adresse), der den lokalen Port 27 (0x1B) überwacht. IP-Adressen sind 4 Byte in inet_ntoahexadezimaler Schreibweise in "Netzwerknotation". Sie können die Funktion verwenden, um sie in die Standardnotation abcd (in diesem Fall 127.0.0.1) zu konvertieren.

Beachten Sie, dass diese Dateien 0 Byte zu sein scheinen, aber Inhalt haben, wenn Sie sie lesen. Beachten Sie auch, dass -adies bei grep erforderlich ist, da sie (z. B. bei unix) als binär erscheinen können.

Marki555
quelle
Es gibt auch /proc/net/tcp6und /proc/net/udp6für IPv6.
Craig McQueen