[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Операции над разделяемой памятью

Операции над разделяемой памятью состоят только в присоединении и
отсоединении сегмента. Запись и считывание данных выполняются обычными
методами доступа к памяти.
shmat(2) отображает разделяемый сегмент в адресное пространство
пользователя.
Аргументы вызова:
shmid является идентификатором разделяемого сегмента, полученным от
успешного вызова shmget(2).
shmaddr, вместе с shmflg, определяет адрес, по которому будет помещен
присоединенный сегмент. Если shmaddr равен нулю, система определяет
адрес сама.
Если shmaddr не равен нулю, его значение будет взято в качестве
адреса. Это должен быть адрес, который ОС UNIX могла бы выбрать для
этой цели. Это не может быть произвольный адрес. Поэтому
предоставление выбора адреса присоединения системе улучшает
переносимость вашей программы. При использовании флага SHM_RND адрес
будет округляться до начала страницы. Иначе будет использоваться
неокругленный адрес.
Параметр shmflg, кроме управления округлением адреса присоединения,
может сделать сегмент доступным только для чтения с помощью флага
SHM_RDONLY.
Процесс может присоединить более одного разделяемого сегмента.
Единственное ограничение состоит в том, что области виртуальных
адресов не могут перекрываться. Системный параметр SHMSEG ограничивает
количество сегментов, присоединенных к одному процессу.
shmdt(2) отсоединяет разделяемый сегмент, присоединенный по адресу
shmaddr. Когда процесс отсоединяет сегмент, поле shm_nattch в
дескрипторе этого сегмента уменьшается на 1. Если программа не
исполнит shmdt(2) явным образом, exit(2) отсоединит все разделяемые
сегменты.
Системные вызовы exec и exit отсоединяют все разделяемые сегменты,
присоединенные к адресному пространству процесса. Когда выполняется
fork(2), порожденный процесс наследует все разделяемые сегменты.
                   ОПЕРАЦИИ НАД РАЗДЕЛЯЕМОЙ ПАМЯТЬЮ
shmop(2)

ИМЯ

     shmop - операции над разделяемой памятью

ИСПОЛЬЗОВАНИЕ

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

     void *shmat(int shmid, void *shmaddr, int shmflg);
     int shmdt (void *shmaddr);

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

     shmat успех - виртуальный адрес начала сегмента

     shmdt успех     - 0
               неуспех - -1 и errno установлена