Другие ответы добавили отличные вещи. Я добавлю только мои 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
easy с помощью 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) и
- Символические ссылки