Устройство Linux / Объяснение

/proc/PID/fd: куда направлены открытые дескрипторы

Исследуйте stdin, stdout и stderr через ссылки procfs. Отличите номер дескриптора от пути, распознайте pipe и socket и не прочитайте чужой поток случайно.

Средний8 минОбщие принципы LinuxLinux · понятия и интерфейсыBash · pipeline semantics

Вывод пропал из терминала

Команда работает, но сообщение не появляется в ожидаемом окне. Перед поиском потери данных проверьте, куда направлен поток. У процесса stdout может вести в терминал, файл или канал к другому процессу; номер 1 сам по себе не обещает экран.

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

Каталог fd описывает открытые объекты

Имена записей в /proc/PID/fd — номера дескрипторов процесса. Традиционно 0 соответствует stdin, 1 — stdout, 2 — stderr. Ссылки на каналы и сокеты показывают вид объекта и inode; некоторым специальным объектам соответствует обозначение anon_inode.

Дескриптор принадлежит процессу, а не глобальному списку файлов. Номер 3 у двух программ может обозначать совершенно разные объекты. Кроме того, программа может закрывать и повторно использовать номера, пока вы читаете каталог.

Осмотрите три стандартных потока

Выполните команды в собственной интерактивной Bash. readlink печатает представление ссылки; он не читает содержимое терминала, канала или файла назначения.

Локальная Linux-система
stream_pid=$$
for descriptor in 0 1 2; do
  printf "fd %s -> " "$descriptor"
  readlink "/proc/$stream_pid/fd/$descriptor"
done

Свяжите объект с поведением программы

Если все три ссылки ведут на один терминал, это согласуется с обычным интерактивным сеансом. Если одна ведёт в файл, проверьте, ожидалось ли перенаправление именно этого потока. Ссылка pipe:[число] указывает канал, а не обычный путь, который нужно искать на диске.

Для чужой службы выберите PID и снимите аналогичный список, если у вас есть доступ. Не заменяйте readlink на cat по всем записям: чтение канала может забрать предназначенные приложению данные, а чтение терминала — ждать ввод. Не закрывайте дескриптор только потому, что назначение пока не знакомо.

Проверьте своё рассуждение

Задача: stdout и stderr ведут в один файл. Доказывает ли это, что программа пишет ошибки в stdout?

Нет. Потоки могут быть объединены перенаправлением. По месту назначения нельзя определить, какой дескриптор использовал каждый вызов записи; для следующего опыта нужно раздельное контролируемое наблюдение.

Ссылка не даёт дополнительных прав

Просмотр ссылок и открытие их целей подчиняются проверкам доступа. Исчезновение номера возможно из-за закрытия дескриптора, а метка deleted у файлов требует отдельного разбора времени удаления и открытых ссылок. Снимок fd не является согласованной историей всех операций ввода-вывода.

Технические источники

Использованы для проверки поведения. Объяснения и учебные сценарии созданы для проекта.

  • Linux man-pages — proc_pid_fd(5)

Проверка текста: 2026-09-11. Нативное исполнение на всей матрице дистрибутивов ещё не подтверждено.

Нужны собственная Linux-система, смонтированный procfs и Bash. Доступность полей зависит от ядра, его конфигурации, прав и пространств имён. Примеры только читают диагностические интерфейсы; браузерный симулятор их не реализует.

От материала к практике

Выберите следующую тему в каталоге Linux или проверьте знакомые команды в учебном терминале.

Поиск по Linux

Поиск локальный. ↑ ↓ — перейти к результату, Enter — открыть.

Навигация