LINUX.ORG.RU

lsof

Если линукс то ls -la /proc/<pid>/fd

true_admin ★★★★★
()

В общем случае это невозможно, так как у дескриптора открытого файла может быть от 0 до N разных имён.

Deleted
()
Ответ на: комментарий от Deleted

Про /proc уже выше сказали. Но это всё равно не 100%ный способ.

Deleted
()
Ответ на: комментарий от Deleted

В общем случае, насколько я понимаю, файловый дескриптор ссылается на файловую и-ноду в которой имени файла нету. Т.е. получается, что имея дескриптор об имени ничего не узнать ? Может тогда как-то через таблицу открытых файлов процесса ?

anonymous
()
Ответ на: комментарий от anonymous

В общем случае, сканировать всю фс на предмет файлов с известной inode.

anonymous
()
Ответ на: комментарий от anonymous

>> Т.е. получается, что имея дескриптор об имени ничего не узнать ?
>> Может тогда как-то через таблицу открытых файлов процесса ?

Выше уже сказали про /proc. В /proc/pid_процесса/fd/ лежат симлинки
№дескриптора -> имя_файла_или_что_то_другое. Процесс сам себя в /proc
видит как /proc/self/.

Выглядит это примерно так:

# ls -l /proc/7095/fd/
итого 0
lrwx------ 1 root root 64 Дек 22 16:11 0 -> /dev/null
lrwx------ 1 root root 64 Дек 22 16:11 1 -> /dev/null
lrwx------ 1 root root 64 Дек 22 16:11 10 -> /var/lib/openldap-data/alock
lrwx------ 1 root root 64 Дек 22 16:11 11 -> /var/lib/openldap-data/id2entry.bdb
lrwx------ 1 root root 64 Дек 22 16:11 12 -> /var/lib/openldap-data/dn2id.bdb
lrwx------ 1 root root 64 Дек 22 16:11 13 -> /var/lib/openldap-data/log.0000000001
lrwx------ 1 root root 64 Дек 22 16:11 15 -> /var/lib/openldap-data/objectClass.bdb
lrwx------ 1 root root 64 Дек 22 16:11 2 -> /dev/null
lrwx------ 1 root root 64 Дек 22 16:11 3 -> socket:[13398]
lr-x------ 1 root root 64 Дек 22 16:11 4 -> pipe:[13400]
l-wx------ 1 root root 64 Дек 22 16:11 5 -> pipe:[13400]
lrwx------ 1 root root 64 Дек 22 16:11 6 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 Дек 22 16:11 7 -> socket:[13404]
lrwx------ 1 root root 64 Дек 22 16:11 8 -> socket:[13405]
lrwx------ 1 root root 64 Дек 22 16:11 9 -> socket:[13406]

Deleted
()
Ответ на: комментарий от Deleted

> у дескриптора открытого файла может быть от 0 до N разных имён.

главное узнать под каким именем fopen делали :). А остальные имена find найдёт :).

true_admin ★★★★★
()
Ответ на: комментарий от Cy6erBr4in

А что хардлинки? Хардлинки просто ссылаются на один inode. При открытии двух хардлинков - получим два дескриптора. inode не идентифицирует однозначно файл в системе. Т.к. у вас может быть смонтировано несколько ФС (пусть даже одинаковых).

ps:
Открытый дескриптор определяет структуру file в которой есть dentry и mnt. Вот эти два поля однозначно идентифицируют файл в текущем namespace. Этот открытый дескриптор есть в /proc/<pid>/fd.
Вообщем, в первом же ответе на пост все сказано.




Chumka ★★★
()
Ответ на: комментарий от Cy6erBr4in

> Ну я сразу сказал что не уверен

Ага, вопрос задается раз в полтора месяца, и каждый раз идет бурное обсуждение, и каждый раз кто-то опять неуверен.

ShprotX
()
Ответ на: комментарий от ShprotX

Ну я этот вопрос не перечитываю каждый месяц ;) это первое обсуждение этой проблемы, в котором я решил принять участие :)

Cy6erBr4in ★★★
()
Ответ на: комментарий от Chumka

>Открытый дескриптор определяет структуру file в которой есть dentry и mnt. Вот эти два поля однозначно идентифицируют файл в текущем namespace. Этот открытый дескриптор есть в /proc/<pid>/fd.

"Однозначно" могут и не идентифицировать, если файл не принадлежит namespace.

Murr ★★
()
Ответ на: комментарий от Murr

Файл не принадлежит неймспейсу никогда. Неймспейсу принадлежат точки монтирования, а файл - файловой системе. Один и тот же файл можно видеть из разных мест, из процессов с разными namespace, у этого файла может быть разный путь /bla1/bla1/file или /bla2/bla2/file, но это будет ОДИН И ТОТ ЖЕ файл, с тем же inode. И в каждом случае dentry и mnt будут разными и однозначно определят этот файл.

Chumka ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.