Файловые дексерипторы существуют на двух уровнях: общесистемном и для каждого процесса.
Файловые дескрипторы для каждого процесса (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
Буква показывает в каком режиме открыт файл.
r — чтение
w — запись
u — чтение и запись
Значения TYPE могут быть такими:
- REG – Regular File
- DIR – Directory
- FIFO – First In First Out
Еще можно увидеть дескрипторы в каталоге процесса
sudo ls /proc/9590/fd0 1 2 3 4
Читайте про управление процессами в Linux.