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

Файловые дексерипторы существуют на двух уровнях: общесистемном и для каждого процесса.

Файловые дескрипторы для каждого процесса (fdtable) не уникальны, но привязываются к v-node таблице, которая содержит значения для всей системы.

Вызовы fopen() и fileno() возвращают номера дескрипторов для процесса, т.е. fdtable. Далее будет рассматриваться только эта таблица.

 

 

Дескрипторы привязываются к процессу.

  • 0 — STDIN
  • 1 — STDOUT
  • 2 — STDERROR

 

 

Для примера запустим процесс в фоне

ping ya.ru &


[1] 9590

 

В консоль будет выведен идентификатор, это 9590. По нему можно смотреть информацию в частности при помощи lsof.

 

 

sudo lsof -p 9590
[sudo] password for admin: 
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
ping    9590 admin  cwd    DIR  253,0     4096 6291458 /home/admin
ping    9590 admin  rtd    DIR  253,0     4096       2 /
ping    9590 admin  txt    REG  253,0    63988 5505166 /bin/ping
ping    9590 admin  mem    REG  253,0    22032  788405 /lib/i386-linux-gnu/libnss_dns-2.27.so
ping    9590 admin  mem    REG  253,0  4568336 8527922 /usr/lib/locale/locale-archive
ping    9590 admin  mem    REG  253,0  1942840  788319 /lib/i386-linux-gnu/libc-2.27.so
ping    9590 admin  mem    REG  253,0    83768  788456 /lib/i386-linux-gnu/libresolv-2.27.so
ping    9590 admin  mem    REG  253,0   239056 8525856 /usr/lib/i386-linux-gnu/libnettle.so.6.4
ping    9590 admin  mem    REG  253,0   206196  788366 /lib/i386-linux-gnu/libidn.so.11.6.16
ping    9590 admin  mem    REG  253,0    17896  788324 /lib/i386-linux-gnu/libcap.so.2.25
ping    9590 admin  mem    REG  253,0     9524  788413 /lib/i386-linux-gnu/libnss_mdns4_minimal.so.2
ping    9590 admin  mem    REG  253,0    50784  788407 /lib/i386-linux-gnu/libnss_files-2.27.so
ping    9590 admin  mem    REG  253,0   159956  788291 /lib/i386-linux-gnu/ld-2.27.so
ping    9590 admin    0u   CHR  136,0      0t0       3 /dev/pts/0
ping    9590 admin    1u   CHR  136,0      0t0       3 /dev/pts/0
ping    9590 admin    2u   CHR  136,0      0t0       3 /dev/pts/0
ping    9590 admin    3u   raw             0t0  196167 00000000:0001->00000000:0000 st=07
ping    9590 admin    4u  raw6             0t0  196169 00000000000000000000000000000000:003A->00000000000000000000000000000000:0000 st=07

 

Здесь интерес представляют четвертая и пятая колонки: FD и TYPE (файловый дескриптор и тип файлового дескриптора).

 

 

Для FD могут быть такие значения:

  • cwd – Current Working Directory
  • txt – Text file
  • mem – Memory mapped file
  • mmap – Memory mapped device

 

Номер дескриптора можно увидеть в последних строках вывода lsof.
0u, 1u и т.д.

Буква показывает в каком режиме открыт файл.

r — чтение

w — запись

u — чтение и запись

 

 

Значения TYPE могут быть такими:

  • REG – Regular File
  • DIR – Directory
  • FIFO – First In First Out

 

Еще можно увидеть дескрипторы в каталоге процесса
sudo ls /proc/9590/fd
0 1 2 3 4

 

Читайте про управление процессами в Linux.