У симлінк є квазіуніверсальнимі на 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 емулює Linux (для процесів Cygwin) та ./proc/PID/fd/NUM
/proc/self
Існують записи для кожного дескриптора файлів, але вони виглядають як один і той же тип, що і відкритий файл, тому вони не містять інформації про шлях до файлу. Однак вони повідомляють ту саму інформацію, що і у процесі, в якому відкрито файл, тому можна визначити, у якій файловій системі знаходиться файл та його номер індексу. Каталоги відображаються як символьні посилання, однак вони є магічними символьними посиланнями, за якими можна лише слідувати, і повертає порожній рядок./proc/PID/fd
stat
fstat
readlink
У procfiles
команді AIX команда відображає деяку інформацію про відкриті файли процесу. У pfiles
команді Solaris команда відображає деяку інформацію про відкриті файли процесу. Це не включає шлях до файлу (на Solaris, це робиться з Solaris 10, див. Нижче).
На додаток до сучасних версій Solaris є символьні посилання, схожі на символьні посилання Linux у . Команда показує інформацію про процес це відкриті файли, в тому числі шляхів./proc/PID/fd/NUM
/proc/PID/path/NUM
/proc/PID/fd/NUM
pfiles
/proc/PID/fd
це текстовий файл, який містить один запис (рядок) на дескриптор файлу, відкритий процесом. Ім'я файлу там не відстежується.
/proc/PID/
це каталог, але він не містить інформації про дескриптори файлів.
Єдність, /proc
але не має прямого доступу до дескрипторів файлів
(Примітка. Іноді можна отримати інформацію про відкриті файли процесу, прошивши зображення пам'яті, доступні під /proc
. Я не вважаю це "прямим доступом".)
Уніфікує, де файл/proc/PID
Сама файлова система proc почалася в 8-му виданні UNIX, але з іншою структурою, і пройшла через План 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
Профілі FreeBSD застарілі .
Одиниці без /proc
- HP-UX
- OpenBSD
- NetBSD
- Mac OS X
Інформація про дескриптор файлів через інші канали
У fuser
списках команд процесів , які мають зазначений файл відкритим, або файл на зазначених точку монтування. Ця команда є стандартною (доступна для всіх XSI сумісних систем, тобто POSIX з розширенням X / Open System Interface).
Ви не можете перейти від процесу, щоб надати імена за допомогою цієї утиліти.
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