📌 shmget

shmget — системный вызов System V Shared Memory в Unix/Linux, предназначенный для создания или получения идентификатора сегмента общей памяти (shared memory segment).

🧠 Как работает

shmget создаёт или получает сегмент общей памяти:

int shmget(key_t key, size_t size, int shmflg);
  • key — уникальный идентификатор (например, ftok() или IPC_PRIVATE)

  • size — размер сегмента в байтах

  • shmflg — флаги доступа и поведения: IPC_CREAT, IPC_EXCL, 0666

Результат — ID сегмента, который используется в:

  • shmat() — подключение к памяти

  • shmdt() — отключение от сегмента

  • shmctl() — управление (удаление, информация)

⚙️ Где применяется

КонтекстОписание
Shared Memory (System V)Создание/доступ к общему сегменту
IPC между процессамиБыстрый обмен данными через RAM
RTOS и EmbeddedСтатически распределённая память

💻 Пример (C)

key_t key = ftok("file.txt", 65);
int shmid = shmget(key, 1024, 0666 | IPC_CREAT);
char *data = (char*) shmat(shmid, (void*)0, 0);
strcpy(data, "hello from shared memory");

✅ Преимущества

  • Простое и классическое API

  • Поддерживается всеми POSIX-системами

  • Работает даже без mmap()

❌ Недостатки

  • Устаревшее API по сравнению с POSIX Shared Memory

  • Нужна ручная синхронизация (через Semaphore/Mutex)

  • Неудобные идентификаторы (key_t, shmid) и управление

  • Могут накапливаться “зависшие” сегменты (без IPC_RMID)