📌 File Descriptor FD
File Descriptor FD — это целочисленный идентификатор, используемый Kernel для абстракции доступа к файлам, сокетам, FIFO, устройствам и другим объектам ввода-вывода.
🧠 Как работает
Каждый процесс в Linux или Unix поддерживает таблицу FD, в которой содержатся указатели на открытые объекты ядра:
- open() создаёт новый дескриптор
- read(), write(), ioctl() работают через номер дескриптора
- FD — это индекс в таблице, указывающий на структуру
struct file
в ядре - Наследуются при fork(), могут быть дублированы через dup()
- Первые три:
0
— stdin,1
— stdout,2
— stderr
Связь:
User Process
└── FD Table [0: stdin] → [file*] → inode → disk or socket
⚙️ Где применяется
Контекст | Примеры |
---|---|
Syscall API | open, close, read, write, poll, select |
Sockets | TCP/UDP соединения через дескриптор |
Pipes / FIFO | Каналы между процессами |
epoll / select | Мультиплексирование ввода-вывода |
Event loop | Реакция на события в async IO |
💻 Пример (C, открытие файла)
#include <fcntl.h>
#include <unistd.h>
int fd = open("file.txt", O_RDONLY);
if (fd < 0) { /* ошибка */ }
char buf[100];
read(fd, buf, 100);
close(fd);
✅ Преимущества
-
Унифицированный интерфейс ко всем видам I/O
-
Простота: целочисленное представление
-
Поддерживает неблокирующий и асинхронный I/O
❌ Недостатки
-
Ограничено количество FD на процесс (
ulimit -n
) -
Утечки FD при неправильной обработке (
close()
забыли) -
Не все системные ресурсы отображаются на FD (например, Memory Map)