Какая функция создаёт объект разделяемой памяти в Linux?

«Какая функция создаёт объект разделяемой памяти в Linux?» — вопрос из категории Linux и ОС, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Linux для создания сегмента разделяемой памяти (shared memory) используется системный вызов shmget().

Сигнатура:

#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);

Параметры:

  • key (key_t): Ключ для идентификации сегмента. Можно использовать IPC_PRIVATE для создания нового уникального сегмента, или сгенерировать ключ с помощью ftok().
  • size (size_t): Размер создаваемого сегмента в байтах.
  • shmflg (int): Флаги, определяющие права доступа (например, 0666) и режим создания. Часто используются комбинации:
    • IPC_CREAT: Создать сегмент, если он не существует.
    • IPC_EXCL: В комбинации с IPC_CREAT гарантирует, что вызов завершится ошибкой, если сегмент с таким ключом уже существует.

Возвращаемое значение: При успехе — целочисленный идентификатор сегмента разделяемой памяти (shmid). При ошибке — -1, и переменная errno устанавливается соответствующим образом.

Пример создания сегмента:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    // Создаём сегмент размером 1024 байта с правами чтения и записи для всех.
    // IPC_CREAT | 0666 означает: создать, если не существует, и дать права rw-rw-rw-.
    int shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT | 0666);

    if (shmid == -1) {
        perror("shmget failed");
        exit(EXIT_FAILURE);
    }

    printf("Shared memory segment created with ID: %dn", shmid);

    // ... далее сегмент можно присоединить с помощью shmat()
    return 0;
}

После создания сегмента процессы используют shmat() для присоединения (получения указателя на эту память) и shmdt() для отсоединения. Управление жизненным циклом (удаление) осуществляется через shmctl() с командой IPC_RMID.