Ответ
В 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.