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

Несколько процессов могут отображать разделяемый сегмент в свое
адресное пространство.
1.   Один из процессов создает разделяемый сегмент вызовом shmget(2) с
     флагом IPC_CREAT. Эта операция выделяет сегмент памяти требуемого
     размера. Кроме того, создается дескриптор для этого сегмента.

2.   Обычно после  того, как  создатель присоединил созданный сегмент,
     он инициализирует  память в нем. Присоединение отображает сегмент
     в   адресное    пространство   процесса.    Доступ   к   сегменту
     осуществляется обращением  к  адресам,  вычисляемым  относительно
     виртуального адреса, который возвратил shmat(2).

     Процесс, который  создал разделяемый  сегмент, обычно  и  удаляет
     его. Это делается после того, как все процессы закончили работу с
     сегментом.

3.   Другие процессы  должны получать  доступ к разделяемому сегменту.
     Доступ  осуществляется  вызовом  shmat(2)  с  идентификатором  id
     разделяемого сегмента.  Этот  идентификатор  может  быть  получен
     следующими способами:

     - Создатель передает id другим процессам.

     - Если  ключ не является приватным, id может быть получен вызовом
        shmget(2).

     После получения  доступа, процесс может отобразить сегмент в свое
     адресное пространство.  Ссылки на  этот сегмент также должны быть
     относительно его виртуального адреса. Виртуальные адреса сегмента
     для разных процессов могут быть различными.

4.   Когда процесс  закончил работу  с сегментом,  он отсоединяет  его
     вызовом shmdt(2).  Попытки доступа  к содержимому  сегмента после
     shmdt(2) приведут к нарушению сегментной защиты (SIGSEGV).

5.   Процесс, который  создал разделяемый  сегмент, обычно удаляет его
     вызовом shmctl(2)  с командой  IPC_RMID. В  принципе,  это  может
     сделать любой  процесс с  эффективным uid  создателя или  хозяина
     разделяемого сегмента.  Можно выполнить  удаление  до  того,  как
     счетчик присоединений  к сегменту  станет нулевым (т.е. кто-то из
     процессов  все   еще  использует  сегмент).  Запрос  на  удаление
     помечает  сегмент,  но  само  удаление  происходит  только  когда
     количество  присоединившихся   процессов  станет  равно  0.  Флаг
     ожидания удаления виден как D в выводе команды ipcs(1).