/proc/PID/fd: куда направлены открытые дескрипторы
Исследуйте stdin, stdout и stderr через ссылки procfs. Отличите номер дескриптора от пути, распознайте pipe и socket и не прочитайте чужой поток случайно.
Вывод пропал из терминала
Команда работает, но сообщение не появляется в ожидаемом окне. Перед поиском потери данных проверьте, куда направлен поток. У процесса stdout может вести в терминал, файл или канал к другому процессу; номер 1 сам по себе не обещает экран.
В этом опыте мы осматриваем ссылки, а не читаем объекты, на которые они указывают. Такой подход позволяет понять назначение дескрипторов и не потреблять данные из канала ради проверки.
Каталог fd описывает открытые объекты
Имена записей в /proc/PID/fd — номера дескрипторов процесса. Традиционно 0 соответствует stdin, 1 — stdout, 2 — stderr. Ссылки на каналы и сокеты показывают вид объекта и inode; некоторым специальным объектам соответствует обозначение anon_inode.
Дескриптор принадлежит процессу, а не глобальному списку файлов. Номер 3 у двух программ может обозначать совершенно разные объекты. Кроме того, программа может закрывать и повторно использовать номера, пока вы читаете каталог.
Осмотрите три стандартных потока
Выполните команды в собственной интерактивной Bash. readlink печатает представление ссылки; он не читает содержимое терминала, канала или файла назначения.
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 или проверьте знакомые команды в учебном терминале.