/ proc / PID / fd / X номер посилання


36

У Linux, у /proc/PID/fd/Xпосиланнях на дескриптори файлів, які є трубами або розетками, є таке число, як:

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]

Як у першому рядку: 6839. Що це число представляє?

Відповіді:


36

Це номер inode для труби або розетки, про яку йдеться.

Труба - це односпрямований канал, що має кінець запису та читання. У вашому прикладі схоже, що FD 5 і FD 6 розмовляють один з одним, оскільки номери inode однакові. (Можливо, ні. Хоча див. Нижче.)

Більш поширеним, ніж бачити програму, що розмовляє сама по трубі, - це пара окремих програм, що розмовляють між собою, як правило, тому, що ви встановлюєте трубу між ними разом із оболонкою:

shell-1$ ls -lR / | less

Потім у іншому вікні терміналу:

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]

Це говорить про те, що стандартний вихід PID 4242 (FD 1, за умовами) підключений до труби з номером inode 222536390, а стандартний вхід PID 4243 (FD 0) підключений до тієї ж труби.

Все це - довгий шлях сказати, що lsвихідний сигнал надсилається на lessвхід.

Повертаючись до вашого прикладу, FD 1 і FD 2 майже напевно не розмовляють між собою. Швидше за все, це результат поєднання stdout (FD 1) та stderr (FD 2) разом, тому вони обидва їдуть до одного пункту призначення. Ви можете зробити це з оболонкою Борна так:

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

Отже, якщо ви засунулися /proc/$PID_OF_SOME_OTHER_PROGRAM/fd, ви знайдете третій FD, приєднаний до труби з тим самим номером inode, який приєднаний до FD 1 і 2 для some-programприкладу. Це також може статися з FD 5 та 6 у вашому прикладі, але я не маю готової теорії, як ці два FD пов'язані між собою. Ви повинні знати, що програма робить всередині, щоб зрозуміти це.


1
Приклад, я думаю, був pidgin- у ньому було багато труб та розеток та іншого, тому це був приємний приклад. Останнє питання: узори конкретні лише у контексті певної файлової системи, правильно? Як і в, я міг мати в своїй /файловій системі inode 3 , а іншу (інший) - в моїй /bootфайловій системі.
Танатос

4
Так. У випадку з /procфайловою системою номери inode просто складаються з льоту (див. get_next_ino()В fs/inode.cядрі), починаючи з 0, коли система завантажується вперше. Механізм, який їх створює, ділиться кількома непостійними файловими системами Linux (proc, config, ramfs, autofs ...), серед яких номери inode є унікальними, навіть якщо семантика POSIX цього не вимагає. Це, однак, досить особливий випадок. Правило, про яке ви говорите, зазвичай посилається на зв’язок із звичайними стійкими файловими системами, такими як ext3.
Warren Young

33

Для розеток ви можете знайти більше інформації про inode в /proc/net/tcp, /proc/net/udpабо /proc/net/unix. Наприклад:

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

Ми бачимо, що inode - 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

У цьому випадку це розетка прослуховування (без віддаленої адреси), прослуховування через локальний порт 27 (0x1B). IP-адреси - це 4 байти в шістнадцятковій частині "мережевої нотації", ви можете використовувати inet_ntoaфункцію для перетворення її в стандартну нотацію abcd (127.0.0.1 в цьому випадку).

Зауважте, що ці файли здаються 0 байтами, але містять вміст, якщо ви їх читаєте. Також зауважте, що -aпотрібно з грепом, оскільки вони (наприклад, з unix) можуть бути двійковими.


Є також /proc/net/tcp6і /proc/net/udp6для IPv6.
Крейг МакКуїн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.