Інші відповіді додали чудові речі. Я додам лише свої 2 копійки.
Згідно з Вікіпедією, ми точно знаємо: дескриптор файлу - це невід'ємне ціле число. Найголовніше, що мені здається, відсутнє, було б сказати:
Дескриптори файлів прив’язані до ідентифікатора процесу.
Ми знаємо, що найвідоміші дескриптори файлів: 0, 1 і 2. 0 відповідає STDIN
1 STDOUT
, 2 і 2 STDERR
.
Скажімо, візьміть приклади оболонок як приклад і як це застосовується для цього?
Перевірте цей код
#>sleep 1000 &
[12] 14726
Ми створили процес з id 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
4-й стовпчик 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 вказує тип файлу. Деякі з значень TYPE:
REG – Regular File
DIR – Directory
FIFO – First In First Out
Але всі дескриптори файлів - це CHR - спеціальний файл символів (або файл пристрою символів)
Тепер ми можемо визначити Дескриптори файлів для STDIN
, STDOUT
і STDERR
легко lsof -p PID
, або ми можемо побачити те саме, якщо ми ls /proc/PID/fd
.
Зауважте також, що таблиця дескрипторів файлів, за якою відслідковується ядро, не збігається з таблицею файлів або таблицею вкладень. Це окремо, як пояснили деякі інші відповіді.
Ви можете запитати себе, де знаходяться ці дескриптори файлів фізично і що зберігається, /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) та
- Символічні посилання