Другие ответы добавили отличные вещи. Я добавлю только мои 2 цента.
Согласно Википедии мы точно знаем: дескриптор файла является неотрицательным целым числом. Самая важная вещь, которую я считаю отсутствующей, это сказать:
Файловые дескрипторы привязаны к идентификатору процесса.
Мы знаем, что наиболее известные файловые дескрипторы - это 0, 1 и 2. 0 соответствует STDIN
, 1 к STDOUT
и 2 к STDERR
.
Скажем, возьмем процессы оболочки в качестве примера и как это применимо к нему?
Проверьте этот код
#>sleep 1000 &
[12] 14726
Мы создали процесс с идентификатором 14726 (PID). Используя lsof -p 14726
мы можем получить такие вещи:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 14726 root cwd DIR 8,1 4096 1201140 /home/x
sleep 14726 root rtd DIR 8,1 4096 2 /
sleep 14726 root txt REG 8,1 35000 786587 /bin/sleep
sleep 14726 root mem REG 8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep 14726 root mem REG 8,1 2030544 137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep 14726 root mem REG 8,1 170960 137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
Четвертый столбец FD и следующий столбец TYPE соответствуют дескриптору файла и типу дескриптора файла.
Некоторые значения для FD могут быть:
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
Но настоящий дескриптор файла находится под:
NUMBER – Represent the actual file descriptor.
Символ после числа, т.е. «1u», представляет режим, в котором файл открывается. r для чтения, w для записи, u для чтения и записи.
TYPE указывает тип файла. Некоторые из значений типов:
REG – Regular File
DIR – Directory
FIFO – First In First Out
Но все файловые дескрипторы являются CHR - символьный специальный файл (или файл символьного устройства)
Теперь мы можем определить дескрипторы файлов для STDIN
, STDOUT
и STDERR
легко с lsof -p PID
, или мы можем увидеть то же самое , если мы ls /proc/PID/fd
.
Также обратите внимание, что таблица файловых дескрипторов, которую отслеживает ядро, отличается от таблицы файлов или таблицы inode. Это отдельные, как объяснили некоторые другие ответы.
Вы можете спросить себя, где эти файловые дескрипторы физически и что хранится, /dev/pts/6
например, в
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
Ну, /dev/pts/6
живет чисто в памяти. Это не обычные файлы, а так называемые файлы символьных устройств . Вы можете проверить это с помощью: ls -l /dev/pts/6
и они начнутся с c
, в моем случае crw--w----
.
Напомним, что большинство Linux-подобных ОС определяют семь типов файлов:
- Обычные файлы
- Справочники
- Файлы символьных устройств
- Блокировать файлы устройства
- Локальные доменные сокеты
- Именованные трубы (FIFO) и
- Символьные ссылки