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


20

Я завжди задавався цим , але ніколи не знайшов час , щоб з'ясувати, так що я буду робити це зараз - як портативний є використання показано тут або /proc/$$/fd/$Nабо /dev/fd/$N? Я розумію гарантії POSIX /dev/null, /dev/tty, and /dev/console (хоча це я дізнався лише на днях, прочитавши коментарі до цієї відповіді ), але як бути з цими іншими?

Наскільки я можу сказати, вони досить поширені, але в яких системах я не розраховую їх знайти? Чому ні? Чи швидше знайти одного, ніж іншого? Чи завжди вони проявлятимуть себе як атрибути?

Я, як правило, використовую ці пристрої досить широко всіляко, і хотілося б знати, чи є шанс я просто спробую просто спробувати.

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

Відповіді:


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 емулює Linux (для процесів Cygwin) та ./proc/PID/fd/NUM/proc/self

Solaris (з версії 2.6), AIX

Існують записи для кожного дескриптора файлів, але вони виглядають як один і той же тип, що і відкритий файл, тому вони не містять інформації про шлях до файлу. Однак вони повідомляють ту саму інформацію, що і у процесі, в якому відкрито файл, тому можна визначити, у якій файловій системі знаходиться файл та його номер індексу. Каталоги відображаються як символьні посилання, однак вони є магічними символьними посиланнями, за якими можна лише слідувати, і повертає порожній рядок./proc/PID/fdstatfstatreadlink

У procfilesкоманді AIX команда відображає деяку інформацію про відкриті файли процесу. У pfilesкоманді Solaris команда відображає деяку інформацію про відкриті файли процесу. Це не включає шлях до файлу (на Solaris, це робиться з Solaris 10, див. Нижче).

Solarisверсії 10 )

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

План9

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

QNX

/proc/PID/ це каталог, але він не містить інформації про дескриптори файлів.

Єдність, /procале не має прямого доступу до дескрипторів файлів

(Примітка. Іноді можна отримати інформацію про відкриті файли процесу, прошивши зображення пам'яті, доступні під /proc. Я не вважаю це "прямим доступом".)

Уніфікує, де файл/proc/PID

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

  • Солярі до 2,5
  • OSF / 1 тепер відомий як Tru64
  • IRIX (?)
  • ШОС (?)

МІНІКС 3

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

FreeBSD

FreeBSD має каталоги, але вони не надають інформацію про дескриптори відкритих файлів. (Однак є схожий на Linux , що дає доступ до виконуваного файлу через символічне посилання.)/proc/PID//proc/PID/file/proc/PID/exe

Профілі FreeBSD застарілі .

Одиниці без /proc

  • HP-UX
  • OpenBSD
  • NetBSD
  • Mac OS X

Інформація про дескриптор файлів через інші канали

Фюзер

У fuserсписках команд процесів , які мають зазначений файл відкритим, або файл на зазначених точку монтування. Ця команда є стандартною (доступна для всіх XSI сумісних систем, тобто POSIX з розширенням X / Open System Interface).

Ви не можете перейти від процесу, щоб надати імена за допомогою цієї утиліти.

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 трохи застаріли. З випуском 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.

Solaris: має /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- це, напевно, такі речі, які можуть працювати у всіх областях?
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.
контрмодель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.