Книга: Программирование для Linux. Профессиональный подход
5.1.3. Выделение сегментов памяти
5.1.3. Выделение сегментов памяти
Процесс выделяет сегмент памяти с помощью функции shmget()
. Первым аргументом функции является целочисленный ключ, идентифицирующий создаваемый сегмент. Если несвязанные процессы хотят получить доступ к одному и тому же сегменту, они должны указать одинаковый ключ. К сожалению, ничто не мешает посторонним процессам выбрать тот же самый ключ сегмента, а это приведет к системному конфликту. Указание специальной константы IPC_PRIVATE
в качестве ключа позволяет гарантировать, что будет создан совершенно новый сегмент.
Во втором аргументе функции задается размер сегмента в байтах. Это значение округляется, чтобы быть кратным размеру страницы ВП.
Третий параметр содержит набор битовых флагов. Перечислим наиболее важные из них.
? IPC_CREAT
. Указывает на то, что создается новый сегмент, которому присваивается заданный ключ.
? IPC_EXCL
. Всегда используется совместно с флагом IPC_CREAT
и заставляет функцию shmget()
выдать ошибку в случае, когда сегмент с указанным ключом уже существует. Если флаг не указан и возникает описанная ситуация, функция shmget()
возвращает идентификатор существующего сегмента, не создавая новый сегмент.
? Флаги режима. В эту группу входят 9 флагов, задающих права доступа к сегменту для владельца, группы и остальных пользователей. Биты выполнения игнорируются. Проще всего задавать права доступа с помощью констант, определенных в файле <sys/stat.h>
(они описаны на man
-странице функции stat()
).[15] Например, флаги S_IRUSR
и S_IWUSR
предоставляют право чтения и записи владельцу сегмента, а флаги S_IROTH
и S_IWOTH
предоставляют аналогичные права остальным пользователям.
В следующем фрагменте программы функция shmget()
создает новый совместно используемый сегмент памяти (или возвращает идентификатор существующего, если значение shm_key
уже зарегистрировано в системе), доступный для чтения/записи только его владельцу:
int segment_id = shmget(shm_key, getpagesize(),
IPC_CREAT | S_IRUSR | S_IWUSR);
В случае успешного завершения функция возвращает идентификатор сегмента. Если сегмент уже существует, проверяются нрава доступа к нему.
- 3.2. Выделение памяти
- 5.1.2. Модель памяти
- 5.1.5. Контроль и освобождение совместно используемой памяти
- 3.2.1.2. Начальное выделение памяти: malloc()
- Неисправности оперативной памяти
- Как работает модуль оперативной памяти
- Описание типов модулей оперативной памяти
- Извлечение и установка модулей памяти
- Характеристики модулей памяти
- ПО для диагностики оперативной памяти
- Поиск и устранение неисправностей модулей памяти
- 2.3.6. Задание объектов физической памяти