Второй параметр sizeзадает требуемый объем памяти в байтах.
Третий параметр shmflgсодержит девять флагов прав доступа, которые используются так же, как флаги режима создающихся файлов. Для создания нового сегмента совместно используемой памяти специальный бит, описываемый IPC_CREAT, должен с помощью поразрядной операции ORбыть объединен с правами доступа. Не считается ошибкой задание флага IPC_CREATи передача ключа существующего сегмента совместно используемой памяти. Флаг IPC_CREAT, если в нем нет нужды, беззвучно игнорируется.
Флаги прав доступа к совместно используемой памяти очень полезны, поскольку позволяют процессу создать совместно используемую память, в которую могут писать процессы, принадлежащие создателю этой разделяемой памяти, а процессы, созданные другими пользователями, могут только читать этот сегмент памяти. Вы можете использовать этот механизм для обеспечения эффективного доступа к данным только для чтения, поместив их в совместно используемую память без какого- либо риска их повреждения другими пользователями.
Если совместно используемая память создана успешно, shmgetвернет неотрицательное целое, идентификатор совместно используемой памяти. В случае аварийного завершения функция вернет -1.
Когда вы впервые создаете сегмент совместно используемой памяти, он недоступен ни одному процессу. Для того чтобы обеспечить доступ к совместно используемой памяти, нужно присоединить ее к адресному пространству процесса. Делается это с помощью функции shmat:
void *shmat(int shm_id, const void *shm_addr, int shmflg);
Первый параметр shm_id— идентификатор совместно используемой области памяти, возвращаемый функцией shmget.
Второй параметр shm_addr— адрес, по которому совместно используемая память присоединяется к текущему процессу. Почти всегда его следует задавать пустым указателем, что позволяет системе выбрать адрес для доступа к совместно используемой памяти.
Третий параметр shmflg— набор поразрядных флагов. Два возможных значения: SHM_RND, в сочетании с shm_addrуправляющее адресом, по которому присоединяется к процессу совместно используемая память, и SHM_RDONLY, которое делает присоединенную память доступной только для чтения. Очень редко возникает необходимость управлять адресом присоединения совместно используемой памяти. Как правило, следует позволить системе выбрать для вас адрес, поскольку в противном случае приложение станет в значительной степени аппаратно-зависимым.
Если вызов shmatзавершился успешно, он вернет указатель на первый байт совместно используемой памяти. В случае аварийного завершения возвращается -1.
Наличие доступа для чтения совместно используемой памяти и записи в нее зависит от владельца (создателя сегмента совместно используемой памяти), прав доступа и владельца текущего процесса. Права доступа к совместно используемой памяти подобны правам доступа к файлам.
Исключение из этого правила возникает, если выражение shmflg & SHM_RDONLYравно true. В этом случае в совместно используемую память нельзя писать, даже если права доступа предоставляют такую возможность.
Функция shmdtотсоединяет совместно используемую память от текущего процесса. Она принимает указатель на адрес, возвращенный функцией shmat. В случае успеха функция вернет 0, в случае ошибки - -1. Имейте в виду, что отсоединение совместно используемой памяти не уничтожает ее, а только делает эту память недоступной для текущего процесса.
Функции управления совместно используемой памятью (к счастью) гораздо проще аналогичных, но более сложных функций для семафоров:
int shmctl(int shm_id, int command, struct shmid_ds *buf);
У структуры типа shmid_dsесть, как минимум, следующие элементы:
struct shmid_ds {
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
}
Первый параметр shm_id— идентификатор, возвращаемый функцией shmget.
Второй параметр commandсодержит предпринимаемое действие. Он может принимать три значения, перечисленные в табл. 14.2.
Таблица 14.2
| Значение |
Описание |
IPC_STAT |
Задаёт данные в структуре shmid_ds, отображающие значения, связанные с совместно используемой памятью |
IPC_SET |
Устанавливает значения, связанные с совместно используемой памятью в соответствии с данными из структуры типа shmid_ds, если у процесса есть право на это действие |
IPC_RMID |
Удаляет сегмент совместно используемой памяти |
Третий параметр buf— указатель на структуру, содержащую режимы и права доступа для совместно используемой памяти.
Читать дальше