### Файловый дескриптор В Linux библиотека libc открывает для каждого запущенного приложения(процесса) 3 файл дескриптора, с номерами 0,1,2. Больше информации вы можете найти [man stdio](https://man7.org/linux/man-pages/man3/stdio.3.html) и [man stdout](https://man7.org/linux/man-pages/man3/stdout.3.html) - `Файл дескриптор 0` называется `STDIN` и ассоциируется с вводом данных у приложения - `Файл дескриптор 1` называется `STDOUT` и используется приложениями для вывода данных, например командами print - `Файл дескриптор 2` называется `STDERR` и используется приложениями для вывода данных, сообщающих об ошибке **Файловые дескрипторы процесса** Каждый процесс в `Unix/Linux` имеет таблицу файловых дескрипторов, представляющую собой структуру, похожую на массив, в которой хранятся ссылки на **файлы** (файлы, сокеты и т. д.), открытые процессом. Эта таблица является **локальной** для процесса. **System File Table** Системная таблица файлов — это структура данных ядра, которая содержит метаданные **обо всех** открытых файлах, включая информацию об их местоположении, режиме доступа, текущей позиции и т. д. Каждая запись в таблице файлов соответствует файловому дескриптору, предоставляя общую информацию для нескольких процессов. - `File Offset`: Current read/write position in the file. - `Access Mode`: Read, write, or read-write mode (e.g., O_RDONLY, O_WRONLY). - `Pointer to Inode`: Links the file table entry to the inode. - `Reference Count`: Tracks how many file descriptors or processes share this entry. **System Inode Table** `inode` — это структура данных, которая содержит метаданные о файле, такие как его размер, разрешения, владелец, временные метки и указатели на блоки данных на диске. **Связь между Process FD table <--> System Table <--> Inode Table** ![1764302196682](../Android/sockets/image/06_sockets_zmq/1764302196682.png) **/proc** В директории `/proc` содержатся виртуальные файлы. Эти файлы перечислены в списке, но не существуют на диске, операционная система создает их "на лету", когда вы пытаетесь прочитать их. **Что внутри процесса?** Директории с **номерными именами** представляют все текущие процессы. Когда процесс заканчивается, его субдиректория в директории `/proc` автоматически исчезает. Если вы откроете эти директории, пока они еще существуют, внутри вы обнаружите множество файлов, таких как: ``` attr cpuset fdinfo mountstats stat auxv cwd loginuid oom_adj statm clear_refs environ maps oom_score status cmdline exe mem root task coredump_filter fd mounts smaps wchan ``` Наиболее важные файлы: - `cmdline`: Содержит команду, запустившую процесс, со всеми своими параметрами. - `cwd`: Содержит симлинк на текущую работающую директорию (current working directory - CWD), ссылку на исполняемый файл процесса, и ссылку на его корневую директорию. - `environ`: Содержит все переменные среды окружения для данного процесса. - `fd`: Содержит все файловые дескрипторы для данного процесса, показывая, какие файлы или устройства процесс задействует. - `maps`, `statm`, and `mem`: Относятся к памяти задействованной в процессе. - `stat` and `status`: Содержит информацию о статусе процесса. **Пример** Запустив программу с инициализацией сокета (возвращаемое значение - идентификатор файлового дескриптора) можно наблюдать появление нового файлового дескриптора для данного сокета. ![1764298032089](../Android/sockets/image/06_sockets_zmq/1764298032089.png) В данном случае скомпилированный бинарный файл имеет название `my_server`. Найти местоположение файловых дескрипторов для программы можно двумя командами: ```bash ps aux | grep -i my_server # можно увидеть номер процесса вашей программы ls -l /proc/<номер процесса>/fd/ ``` Попробуем следующий эксперимент: ![1764299555123](../Android/sockets/image/06_sockets_zmq/1764299555123.png) Что такое /dev/[pts](https://man7.org/linux/man-pages/man4/pts.4.html)?