linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Процессы и ресурсы/file-descriptors

kb/processes ── Процессы и ресурсы ── intermediate

File descriptors (stdin, stdout, stderr)

File descriptor - целое число, через которое процесс обращается к открытому файлу/сокету/pipe. У каждого процесса 0/1/2 = stdin/stdout/stderr.

view as markdownaka: fd, file-descriptor, stdin, stdout, stderr, io-streams

Что такое fd

Когда process-and-pid открывает что-то (файл, сокет, pipe) - ядро возвращает маленькое целое - file descriptor. Дальше процесс обращается к ресурсу по этому числу: read(fd, ...), write(fd, ...), close(fd).

fd - индекс в табличке процесса: /proc/<pid>/fd/N указывает на цель.

Три «магических» fd

Каждый запущенный процесс получает три fd по умолчанию:

fdимяпо умолчанию
0stdinклавиатура (терминал)
1stdoutэкран
2stderrэкран (отдельный поток!)

Это конвенция Unix: программа читает из 0, пишет результат в 1, ошибки в 2. Шелл умеет перенаправлять каждый поток отдельно.

Перенаправления в bash

bash
cmd > out.log              # stdout → файл (= 1>out.log)
cmd 2> err.log              # stderr → файл
cmd > all.log 2>&1          # СНАЧАЛА stdout в файл, потом stderr туда же
cmd > out.log 2> err.log    # развести по разным
cmd &> all.log              # bash-shortcut: и stdout и stderr в один файл
cmd < input.txt             # stdin ← файл
cmd << EOF ... EOF          # heredoc: stdin ← inline-текст
cmd <<< 'one line'          # here-string: stdin ← одна строка

ВАЖНО: 2>&1 означает «продублировать fd 1 в fd 2». Порядок имеет значение: cmd >file 2>&1 правильно (сначала stdout в файл, потом stderr в тот же файл), а cmd 2>&1 >file - нет (stderr ушёл туда где stdout БЫЛ - на терминал).

/dev/null и /dev/stderr

bash
cmd > /dev/null              # выкинуть stdout
cmd 2> /dev/null              # выкинуть stderr (типичное «не показывай ошибки»)
cmd > /dev/null 2>&1          # выкинуть всё

/dev/null - спецфайл, всё что пишут - теряется; чтение даёт EOF.

Pipe = fd между процессами

bash
ls | grep '.txt'

Шелл создаёт pipe (две связанные fd), форкает оба процесса: у ls stdout заменён на write-конец pipe, у grep stdin заменён на read-конец. Получается потоковая передача без файлов.

/proc/<pid>/fd - что открыто прямо сейчас

bash
ls -l /proc/$$/fd/         # fd текущего шелла (symlink'и на цели)
ls -l /proc/$$/fd/0        # обычно → /dev/pts/X (терминал)
ls -l /proc/<pid>/fd/      # любой процесс (нужны права)

Это то же что показывает cmd-lsof -p <pid>.

Лимиты

Сколько fd может одновременно держать один процесс:

bash
ulimit -n                  # текущий soft-лимит (обычно 1024 или 65535)
cat /proc/sys/fs/file-max  # глобальный лимит на ВСЕ процессы

«Too many open files» = упёрлись в лимит. Поднимается через ulimit -n в shell или LimitNOFILE= в systemd unit.

Дублирование fd: dup2()

Из C-кода - dup2(src, dst) копирует src в dst. Это и есть основа редиректов: shell делает dup2(open("file"), 1) чтобы перенаправить stdout процесса перед exec-ом.

§ команды

bash
ls -l /proc/$$/fd/

Что открыто текущим шеллом (0/1/2 + всё что fork-ом унаследовали)

bash
command > out.log 2>&1

И stdout, и stderr в один файл - порядок важен

bash
command 2> >(grep -v WARN >&2)

Process substitution: фильтровать stderr через grep, не теряя stdout

bash
exec 3>>app.log; echo data >&3

Открыть свой fd 3 на запись и писать туда (полезно в скриптах)

bash
ulimit -n

Текущий лимит fd на процесс - упор сюда даёт «Too many open files»

§ см. также

  • process-and-pidПроцесс и PIDПроцесс - это запущенная программа со своим PID, памятью, открытыми дескрипторами и UID. Все процессы образуют дерево, корень - init (PID 1).
  • cmd-lsoflsof - кто что открыл`lsof` (List Open Files) показывает все открытые файлы по всем процессам. В Linux всё - файл, поэтому это и обычные файлы, и сокеты, и pipe'ы.
  • cmd-stracestrace - какие syscall'ы делает процесс`strace` показывает в реальном времени какие системные вызовы делает процесс и с какими аргументами. Главный инструмент когда «процесс молчит».
  • io-uringio_uring - third-rank async I/O syscallio_uring - shared-memory очередь между userspace и kernel. SQE submit без syscall (с SQPOLL). CQE - completion. Поддержка read/write/accept/connect/recv/send. Заменяет aio+epoll для I/O-bound сервисов. CVE 2022-2024 - не enable бездумно.
  • inodeInodeInode - это запись в файловой системе с метаданными и указателями на блоки данных файла. Имя файла лежит отдельно (в директории) и просто указывает на inode.

§ упоминается в уроках

  • ›beginner-12-shell-scripting
  • ›intermediate-11-advanced-redirects
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки