Создание общего сегмента памяти с помощью функции shmat

В этом разделе приведены инструкции по созданию общего сегмента памяти с помощью функции shmat.

Предварительные требования

Нет.

Процедура

  1. Создайте ключ для идентификации общего сегмента. Для этого вызовите функцию ftok. Например, для создания ключа mykey с идентификатором проекта R, хранящимся в переменной proj (тип char) и именем файла null_file, воспользуйтесь следующим оператором:
    mykey = ftok( null_file, proj );
  2. Выполните одно из следующих действий:
    • Создайте общий сегмент памяти с помощью функции shmget. Например, для создания сегмента размером 4096 и присвоения значения shmid целочисленной переменной mem_id, используйте следующее выражение:
      mem_id = shmget(mykey, 4096, IPC_CREAT | o666 );
    • Получите указатель на ранее созданный общий сегмент с помощью функции shmget. Например, для того чтобы получить ссылку на сегмент, ранее связанный с ключом mykey и присвоить значение shmid целочисленной переменной mem_id, укажите в программе оператор:
      mem_id = shmget( mykey, 4096, IPC_ACCESS );
  3. Предоставьте общий сегмент процессу с помощью функции shmat. Например, для подключения созданного сегмента можно воспользоваться оператором
    ptr = shmat( mem_id );
    В этом примере переменная ptr представляет собой указатель на структуру, определяющую поля общего сегмента. Такая структура-шаблон применяется для чтения и записи данных в общий сегмент. Шаблон должен совпадать для всех процессов, работающих с общим сегментом.
  4. Выполните необходимые операции с данными сегмента, пользуясь шаблонной структурой.
  5. Отключите общий сегмент от процесса с помощью функции shmdt:
    
    shmdt( ptr );
  6. Если общий сегмент больше не нужен, удалите его с помощью функции shmctl:
    
    shmctl( mem_id, IPC_RMID, ptr );

    Примечание: с помощью команды ipcs можно получить информацию о сегменте, а с помощью команды ipcrm удалить сегмент.