Что такое файловый дескриптор в Linux


Файловый дескриптор в 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).

файловый дескриптор linux


Здесь интерес представляют четвертая и пятая колонки: 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 позволяет увидеть ожидание от определенного процесса и связанного с ним файлового дескриптора.

Сказать спасибо