Как найти имя файла, связанное с дескриптором сокета?

Когда я хочу увидеть список открытых файлов для процесса, использующего ls -l /proc/pid/fd, я вижу несколько дескрипторов сокетов. Как я могу найти соответствующие имена файлов?

lr-x------ 1 u1 users 64 Sep 15 14:45 0 -> /dev/null
lrwx------ 1 u1 users 64 Sep 15 14:45 1 -> /dev/pts/3
lrwx------ 1 u1 users 64 Sep 15 14:45 10 -> socket:[507942]
l-wx------ 1 u1 users 64 Sep 15 14:45 2 -> pipe:[505993]
l-wx------ 1 u1 users 64 Sep 15 14:45 22 -> pipe:[505994]
l-wx------ 1 u1 users 64 Sep 15 14:45 3 -> /dev/null
lrwx------ 1 u1 users 64 Sep 15 14:45 4 -> socket:[507938]
lrwx------ 1 u1 users 64 Sep 15 14:45 5 -> socket:[507939]
lrwx------ 1 u1 users 64 Sep 15 14:45 6 -> socket:[486323]
lrwx------ 1 u1 users 64 Sep 15 14:45 7 -> socket:[486324]
lrwx------ 1 u1 users 64 Sep 15 14:45 8 -> socket:[509999]
lrwx------ 1 u1 users 64 Sep 15 14:45 9 -> socket:[507941]

С lsof -p pid я также вижу сокеты.

atIcoFoam 24376 u1  0r   CHR                1,3      0t0     1029 /dev/null
atIcoFoam 24376 u1  1u   CHR              136,3      0t0        6 /dev/pts/3
atIcoFoam 24376 u1  2w  FIFO                0,8      0t0   506122 pipe
atIcoFoam 24376 u1  3w   CHR                1,3      0t0     1029 /dev/null
atIcoFoam 24376 u1  4u  unix 0x0000000000000000      0t0   511127 socket
atIcoFoam 24376 u1  5u  unix 0x0000000000000000      0t0   511128 socket
atIcoFoam 24376 u1  6u  IPv4             510153      0t0      TCP *:37340 (LISTEN)
atIcoFoam 24376 u1  7u  IPv6             510154      0t0      TCP *:43305 (LISTEN)
atIcoFoam 24376 u1  8u  IPv4             512654      0t0      TCP hpclab.ws05:57696->hpclab.ws05:33141 (ESTABLISHED)
atIcoFoam 24376 u1  9u  IPv4             508030      0t0      TCP *:1027 (LISTEN)
atIcoFoam 24376 u1  10u  IPv6             508031      0t0      TCP *:1027 (LISTEN)

person mahmood    schedule 23.10.2012    source источник
comment
сокеты не всегда имеют соответствующие имена файловой системы...   -  person twalberg    schedule 23.10.2012
comment
Итак, как я могу найти имена файлов. Нет ли способа?   -  person mahmood    schedule 23.10.2012
comment
Если у сокета нет имени файла, то его невозможно найти.   -  person twalberg    schedule 23.10.2012
comment
Но есть файл, над которым работает этот процесс   -  person mahmood    schedule 23.10.2012


Ответы (3)


Только именованные сокеты имени домена UNIX (типизированные сокеты AF_UNIX) имеют связанный файл.

Обновление:

Имя такого файла связано с каталогом /proc/<process id>/fd/ с использованием значения дескриптора файла для данного сокета, характерного для процесса.

Все остальные сокеты не имеют представления в файловой системе.

person alk    schedule 23.10.2012
comment
Это просто означает, что вы не найдете запись в файловой системе для каждого списка сокетов /proc/<pid>/fd. @махмуд - person alk; 23.10.2012
comment
Итак, как я могу отслеживать имя файла? - person mahmood; 23.10.2012
comment
Ни для одного сокета AF_UNIX вы просто не можете, так как файла no нет. Для сокетов AF_UNIX соответствующая запись в /proc/<pid>/fd будет ссылкой на него. @махмуд - person alk; 23.10.2012
comment
Это очень странно. потому что есть операция ввода-вывода, которую нельзя отследить! - person mahmood; 23.10.2012
comment
Для мониторинга трафика через сокеты могут помочь tcpdump или wireshark. @махмуд - person alk; 23.10.2012
comment
@mahmood, почему вы говорите, что есть операция ввода-вывода, которую нельзя отследить? - person Celada; 23.10.2012
comment
@Celada: Потому что я не могу найти, какой файл читается или записывается! - person mahmood; 24.10.2012

Вы можете перечислить открытые файлы следующим образом:

lsof -p PID
person Jacek Sokolowski    schedule 23.10.2012

Это прослушивающие сокеты UNIX? Я предполагаю, что да, потому что если они что-то еще, то ваш вопрос не имеет смысла.

lsof обычно может разрешить имя файловой системы, к которой привязан сокет:

lsof -p pid
person Celada    schedule 23.10.2012
comment
Вы уверены, что эти сокеты привязаны к именам? Файловые дескрипторы 4 и 5 в вашем примере вполне могут быть двумя концами анонимного сокета UNIX, созданного с помощью socketpair()... - person Celada; 23.10.2012