В симлинке являются квазиуниверсальными на Linux, но они не существуют нигде ( за исключением Cygwin , который эмулирует их). также существуют в AIX и Solaris, но они не являются символическими ссылками. Портативно, чтобы получить информацию об открытых файлах, установите ./proc/PID/fd/NUM/proc/PID/fd/NUMlsof
Объединения с /proc/PID/fd
В Linux это слегка магическая символическая ссылка на файл, который процесс с идентификатором PID открыл в дескрипторе файла NUM . Эта ссылка волшебна тем, что, например, ее можно использовать для доступа к файлу, даже если файл удален. Ссылка будет отслеживать файл также через переименования. магическая символическая ссылка, указывающая, где PID - это процесс, который обращается к ссылке./proc/PID/fd/NUM/proc/self/proc/PID
Эта функция присутствует практически во всех системах Linux. Он предоставляется драйвером для файловой системы proc , которая технически необязательна, но используется для многих вещей (в том числе для выполнения psработы - она читает ), что она почти никогда не игнорируется даже во встроенных системах./proc/PID
Cygwin
Cygwin эмулирует Linux (для процессов Cygwin) и ./proc/PID/fd/NUM/proc/self
Solaris (начиная с версии 2.6), AIX
Для каждого дескриптора файла есть записи, но они имеют тот же тип, что и открытый файл, поэтому они не предоставляют никакой информации о пути к файлу. Однако они сообщают ту же информацию, что и процесс, в котором открыт файл, так что можно определить, в какой файловой системе находится файл, и его номер inode. Каталоги отображаются в виде символических ссылок, однако они представляют собой магические символические ссылки, по которым можно только следовать, и возвращают пустую строку./proc/PID/fdstatfstatreadlink
В AIX procfilesкоманда отображает некоторую информацию об открытых файлах процесса. В Solaris pfilesкоманда отображает некоторую информацию об открытых файлах процесса. Это не включает путь к файлу (в Solaris он существует начиная с Solaris 10, см. Ниже).
В дополнение к современным версиям Solaris, которые содержат символические ссылки, аналогичные символическим ссылкам Linux в . Команда показывает информацию об открытых файлах процесса, включая пути./proc/PID/fd/NUM/proc/PID/path/NUM/proc/PID/fd/NUMpfiles
/proc/PID/fdтекстовый файл, который содержит одну запись (строку) на дескриптор файла, открытый процессом. Имя файла там не отслеживается.
/proc/PID/ каталог, но он не содержит никакой информации о файловых дескрипторах.
Unices с /procпрямым доступом к файловым дескрипторам, но без него
(Примечание: иногда можно получить информацию об открытых файлах процесса, просматривая образ его памяти, который доступен в разделе /proc. Я не считаю это «прямым доступом».)
Единицы где файл/proc/PID
Сама файловая система proc началась в UNIX 8-й редакции, но с другой структурой, прошла Plan 9 и вернулась к некоторым подразделениям. Я думаю, что во всех операционных системах /procесть запись для каждого PID, но во многих системах это обычный файл, а не каталог. Следующие системы имеют, что нужно читать с :/proc/PIDioctl
- Солярис до 2,5
- OSF / 1 теперь известен как Tru64
- IRIX (?)
- ШОС (?)
MINIX 3 имеет сервер procfs, который предоставляет несколько Linux-подобных компонентов, включая каталоги. Однако этого не существует ./proc/PID//proc/PID/fd
У FreeBSD есть каталоги, но они не предоставляют информацию об открытых дескрипторах файлов. (Однако есть то, что похоже на Linux , предоставляя доступ к исполняемому файлу через символическую ссылку.)/proc/PID//proc/PID/file/proc/PID/exe
Profs во FreeBSD устарел .
Единства без /proc
- HP-UX
- OpenBSD
- NetBSD
- Mac OS X
Информация дескриптора файла по другим каналам
Команда fuserвыводит список процессов, у которых открыт указанный файл или файл, открытый в указанной точке монтирования. Эта команда является стандартной (доступна во всех XSI- совместимых системах, например, POSIX с расширением интерфейса системы X / Open).
С помощью этой утилиты вы не можете перейти от процесса к именам файлов.
Lsof означает «список открытых файлов». Это сторонний инструмент , доступный (но обычно не являющийся частью установки по умолчанию) для большинства вариантов Unix. Получение информации об открытых файлах очень зависит от системы, так как приведенный выше анализ мог вас заподозрить. Сопровождающий lsof выполнил работу по объединению всего этого под одним интерфейсом.
Вы можете прочитать FAQ, чтобы узнать, с какими трудностями сталкивается lsof. В большинстве устройств получение информации об именах открытых файлов требует анализа структур данных ядра. Цитата из часто задаваемых вопросов 3.3 «Почему lsof не сообщает полные пути?»:
Lsof не может получить компоненты имени пути из кэшей имен ядра следующих диалектов:
Только ядро Linux записывает полные пути в структурах, которые оно поддерживает для открытых файлов; вместо этого большинство ядер преобразует имена путей в дублеты номеров устройств и узлов и использует их для последующих ссылок на файлы после открытия файлов.
Если вам необходимо проанализировать информацию из lsofвыходных данных, обязательно используйте -Fрежим (одно поле на строку), предпочтительно -F0режим (поля с нулевым разделением). Для того, чтобы получить информацию о конкретном файле дескриптора процесса конкретного, используйте -aопцию и , например .-p PID-d NUMlsof -a -p 123 -d 0 -F0n
/dev/fd/NUM для файловых дескрипторов текущего процесса
Многие варианты Unix предоставляют способ для доступа к своим открытым файлам через имя файла: открытие эквивалентно вызову . Эти имена полезны, когда программе требуется имя файла, но вы хотите передать уже открытый файл (например, канал или сокет); например, оболочки, которые реализуют подстановку процессов, используют их там, где они доступны (используя временный именованный канал, где он недоступен)./dev/fd/NUMdup(NUM)/dev/fd
Там /dev/fd, где существует, также обычно есть (всегда?) Синонимы (иногда символические ссылки, иногда жесткие ссылки, иногда магические файлы с эквивалентными свойствами) /dev/stdin= /dev/fd/0, /dev/stdout= /dev/fd/1, /dev/stderr= /dev/fd/2.
- Под Linux
/dev/fdэто символическая ссылка на /proc/self/fd.
- Под большинством устройств ( IRIX , OpenBSD , NetBSD , SCO, Solaris и т. Д.) Записи
/dev/fdявляются символьными устройствами. Они обычно появляются независимо от того, открыт файловый дескриптор или нет, и записи могут быть недоступны для файловых дескрипторов выше определенного числа.
- В FreeBSD и OSX файловая система fdescfs предоставляет динамический
/dev/fdкаталог, который следует открытым дескрипторам вызывающего процесса. Статика /dev/fdдоступна, /dev/fdне смонтирована.
- В соответствии с OSF / 1 (Tru64)
/dev/fdпредоставляется через fdfs .
- Нет
/dev/fdв AIX или HP-UX.
pfilesкоманда показывает путь к дескрипторам файлов. Он получает эту информацию из/proc/<pid>/pathкаталога, который вы также можете упомянуть. См. Docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.html