📌 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 APIopen, close, read, write, poll, select
SocketsTCP/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)