В симлинке являются квазиуниверсальными на Linux, но они не существуют нигде ( за исключением Cygwin , который эмулирует их). также существуют в AIX и Solaris, но они не являются символическими ссылками. Портативно, чтобы получить информацию об открытых файлах, установите ./proc/PID/fd/NUM
/proc/PID/fd/NUM
lsof
Объединения с /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/fd
stat
fstat
readlink
В AIX procfiles
команда отображает некоторую информацию об открытых файлах процесса. В Solaris pfiles
команда отображает некоторую информацию об открытых файлах процесса. Это не включает путь к файлу (в Solaris он существует начиная с Solaris 10, см. Ниже).
В дополнение к современным версиям Solaris, которые содержат символические ссылки, аналогичные символическим ссылкам Linux в . Команда показывает информацию об открытых файлах процесса, включая пути./proc/PID/fd/NUM
/proc/PID/path/NUM
/proc/PID/fd/NUM
pfiles
/proc/PID/fd
текстовый файл, который содержит одну запись (строку) на дескриптор файла, открытый процессом. Имя файла там не отслеживается.
/proc/PID/
каталог, но он не содержит никакой информации о файловых дескрипторах.
Unices с /proc
прямым доступом к файловым дескрипторам, но без него
(Примечание: иногда можно получить информацию об открытых файлах процесса, просматривая образ его памяти, который доступен в разделе /proc
. Я не считаю это «прямым доступом».)
Единицы где файл/proc/PID
Сама файловая система proc началась в UNIX 8-й редакции, но с другой структурой, прошла Plan 9 и вернулась к некоторым подразделениям. Я думаю, что во всех операционных системах /proc
есть запись для каждого PID, но во многих системах это обычный файл, а не каталог. Следующие системы имеют, что нужно читать с :/proc/PID
ioctl
- Солярис до 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 NUM
lsof -a -p 123 -d 0 -F0n
/dev/fd/NUM
для файловых дескрипторов текущего процесса
Многие варианты Unix предоставляют способ для доступа к своим открытым файлам через имя файла: открытие эквивалентно вызову . Эти имена полезны, когда программе требуется имя файла, но вы хотите передать уже открытый файл (например, канал или сокет); например, оболочки, которые реализуют подстановку процессов, используют их там, где они доступны (используя временный именованный канал, где он недоступен)./dev/fd/NUM
dup(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Способ
/proc
реализован, и предоставляемые им функции никак не стандартизированы, см., Например, здесь . Согласно Википедии, FreeBSD «постепенно исчезает»/proc
, подробности смотрите здесь .По состоянию на
/dev
,/dev/fd/
не является частью POSIX или однопользовательской спецификации (SUSv3), в то время как System V и BSD поддерживают ее.Приложение:
Linux:
/dev/fd/*
это символические ссылки на/proc/self/fd
.FreeBSD:
/dev/fd/*
предоставляется через fdescfs.NetBSD: так же, как FreeBSD.
OpenBSD: так же, как FreeBSD.
Солярис: есть
/dev/fd/*
.IRIX: есть
/dev/fd/*
.Tru64 Unix:
/dev/fd/*
согласно nixdoc.net , подлинная документация Tru64 в HP непостижима (парень, какой беспорядок! Вы ничего не найдете!).AIX: в общедоступной документации нет указаний.
HP-UX: так же, как AIX.
источник
/dev/fd/1
на BSD, что ссылки на мой текущий1>
? Одна вещь, которую я обычно делаю в Linux,echo 'command' | . /dev/fd/0
- это то, что, вероятно, будет работать по всем направлениям, как вы думаете?