Переносимость файловых дескрипторов ссылок

20

Я всегда удивлялся этому, но никогда не занимал время, чтобы выяснить это, поэтому я сделаю это сейчас - насколько мобильно показанное здесь использование того /proc/$$/fd/$Nили другого /dev/fd/$N? Я понимаю гарантии POSIX /dev/null, /dev/tty, and /dev/console (хотя я узнал об этом только на днях после прочтения комментариев к этому ответу ), но как насчет этих других?

Насколько я могу судить, они довольно распространены, но в каких системах я не могу ожидать их нахождения? Почему нет? Это с большей вероятностью найти один, чем другой? Будут ли они всегда проявлять как атрибуты?

Я имею тенденцию использовать эти устройства довольно широко во всех отношениях, и я хотел бы знать, есть ли шанс, что я потерплю неудачу, просто пытаясь.

Кроме того, вышеприведенные вопросы следует понимать как то, что, я думаю, я хотел бы знать, но, поскольку я, очевидно, должен сначала задавать вопросы, я, возможно, не знаю лучше всего в этом отношении, и их не следует считать строгими требованиями к ответ. Просто подскажите мне, если можете, пожалуйста.

mikeserv
источник

Ответы:

27

В симлинке являются квазиуниверсальными на Linux, но они не существуют нигде ( за исключением Cygwin , который эмулирует их). также существуют в AIX и Solaris, но они не являются символическими ссылками. Портативно, чтобы получить информацию об открытых файлах, установите ./proc/PID/fd/NUM/proc/PID/fd/NUMlsof

Объединения с /proc/PID/fd

Linux

В 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 (начиная с версии 10 )

В дополнение к современным версиям Solaris, которые содержат символические ссылки, аналогичные символическим ссылкам Linux в . Команда показывает информацию об открытых файлах процесса, включая пути./proc/PID/fd/NUM/proc/PID/path/NUM/proc/PID/fd/NUMpfiles

Plan9

/proc/PID/fdтекстовый файл, который содержит одну запись (строку) на дескриптор файла, открытый процессом. Имя файла там не отслеживается.

QNX

/proc/PID/ каталог, но он не содержит никакой информации о файловых дескрипторах.

Unices с /procпрямым доступом к файловым дескрипторам, но без него

(Примечание: иногда можно получить информацию об открытых файлах процесса, просматривая образ его памяти, который доступен в разделе /proc. Я не считаю это «прямым доступом».)

Единицы где файл/proc/PID

Сама файловая система proc началась в UNIX 8-й редакции, но с другой структурой, прошла Plan 9 и вернулась к некоторым подразделениям. Я думаю, что во всех операционных системах /procесть запись для каждого PID, но во многих системах это обычный файл, а не каталог. Следующие системы имеют, что нужно читать с :/proc/PIDioctl

  • Солярис до 2,5
  • OSF / 1 теперь известен как Tru64
  • IRIX (?)
  • ШОС (?)

MINIX 3

MINIX 3 имеет сервер procfs, который предоставляет несколько Linux-подобных компонентов, включая каталоги. Однако этого не существует ./proc/PID//proc/PID/fd

FreeBSD

У 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

Lsof означает «список открытых файлов». Это сторонний инструмент , доступный (но обычно не являющийся частью установки по умолчанию) для большинства вариантов Unix. Получение информации об открытых файлах очень зависит от системы, так как приведенный выше анализ мог вас заподозрить. Сопровождающий lsof выполнил работу по объединению всего этого под одним интерфейсом.

Вы можете прочитать FAQ, чтобы узнать, с какими трудностями сталкивается lsof. В большинстве устройств получение информации об именах открытых файлов требует анализа структур данных ядра. Цитата из часто задаваемых вопросов 3.3 «Почему lsof не сообщает полные пути?»:

Lsof не может получить компоненты имени пути из кэшей имен ядра следующих диалектов:

  • AIX

Только ядро ​​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.
Жиль "ТАК - прекрати быть злым"
источник
Ваши заявления о Солярисе немного устарели. В выпусках Solaris, выпущенных менее 10 лет, pfilesкоманда показывает путь к дескрипторам файлов. Он получает эту информацию из /proc/<pid>/pathкаталога, который вы также можете упомянуть. См. Docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.html
jlliagre
9

Способ /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.

countermode
источник
Так я найду /dev/fd/1на BSD, что ссылки на мой текущий 1>? Одна вещь, которую я обычно делаю в Linux, echo 'command' | . /dev/fd/0- это то, что, вероятно, будет работать по всем направлениям, как вы думаете?
mikeserv
У меня сейчас нет доступа к системе BSD, но я так понимаю, да.
контрмод
1
Если вы когда-нибудь найдете время, чтобы рассказать об этом немного больше, я приму этот ответ, я думаю, если не считать каких-либо неожиданных сообщений о профессиях. В любом случае первая ссылка, на которую ссылались, была читающей - очень большое спасибо.
mikeserv
Да. Я полагаю, профессор ФД все-таки появился, а? Так что, удачи в следующий раз?
mikeserv
1
Тогда все в порядке. Linux: / dev / fd / * являются символическими ссылками на / proc / self / fd. FreeBSD: / dev / fd / * предоставляется через fdescfs. NetBSD: так же, как FreeBSD. OpenBSD: так же, как FreeBSD. Solaris: имеет / dev / fd / *. IRIX: имеет / dev / fd / *. Tru64 Unix: имеет / dev / fd / * (согласно nixdoc.net подлинная документация Tru64 в HP непостижима). AIX: в общедоступной документации нет указаний. HP-UX: так же, как AIX.
контрмод