Файловый дескриптор в Linux характеризует процесс в системе, то как процесс использует при своей работе диск.
Как известно в Linux любая операция является файловой, по каждому процессу можно посмотреть привязку к открытым файлам на диске. Это могут быть пользовательские документы или служебные файлы Linux.
Файловый дескриптор в Linux
Файловый дескриптор может существовать на двух уровнях: общесистемном и для каждого запущенного процесса.
Файловые дескрипторы для каждого процесса (fdtable) не уникальны, но привязываются к v-node таблице, которая содержит значения для всей системы.
Системные вызовы fopen() и fileno() возвращают номера дескрипторов для процесса, то есть fdtable. Далее будем рассматривать только эту таблицу.
Дескрипторы привязываются к процессу.
Каждый процесс имеет ввод, вывод и вывод ошибок, значения соответствуют определенному коду.
- 0 — STDIN
- 1 — STDOUT
- 2 — STDERROR
Используя эти значения можно, например, перенаправлять вывод или вывод ошибок в файл или в /dev/null избавляясь от него.
Для примера запустим процесс в фоне, за счёт амперсанда открепляем вывод (stdout) от консоли и можем работать в консоли при запущенном процессе.
ping ya.ru &
[1] 9590
В консоль будет выведен идентификатор процесса, это в примере 9590. По нему можно смотреть информацию в частности при помощи утилиты lsof (list open files).
Здесь интерес представляют четвертая и пятая колонки: FD и TYPE (файловый дескриптор и тип файлового дескриптора).
FD и TYPE для дескриптора
Для FD могут быть такие значения:
- cwd – Current Working Directory
- txt – Text file
- mem – Memory mapped file
- mmap – Memory mapped device
Номер дескриптора можно увидеть в последних строках вывода lsof в колонке FD: 0u, 1u и так далее.
Цифра это номер дескриптора. Буква показывает в каком режиме открыт файл.
r — чтение
w — запись
u — чтение и запись
Значения TYPE могут быть такими:
- REG – Regular File
- DIR – Directory
- FIFO – First In First Out
Еще можно увидеть дескрипторы в каталоге процесса (9590 — номер процесса)
sudo ls /proc/9590/fd
0 1 2 3 4
Читайте про управление процессами в Linux и про утилиту strace.
При диагностике неполадок strace позволяет увидеть ожидание от определенного процесса и связанного с ним файлового дескриптора.