|
Чтобы сделать сегмент памяти общедоступны, процесс должен подключить его с помощью функции shmat(). В первом ее аргументе предается идентификатор сегмента, возвращаемый функцией shmat().
Второй аргумент — это указатель, определяющий, где в адресном пространстве процесса необходимо создать привязку на совместно используемую область памяти. Если задать значение NULL, ОС Linux выберет первый доступный адрес. Третий аргумент может содержать следующие флаги.
· SHM_RND. Указывает на то, что адрес, заданный во втором параметре должен быть округлен, чтобы стать кратным размеру страницы. Если этот флаг не указан, необходимо самостоятельно позаботиться о выравнивании сегмента по границе страницы.
· SHM_RDONLY. Указывает на то, что сегмент доступен только для чтения, не не для записи.В случае успешного завершения функция возвращает адрес подключенного сегмента. Дочерний процесс, созданный функцией fork(), унаследует этот адрес и в случае необходимости сможет отключить сегмент. По завершении работы с сегментом его необходимо отключить с помощью функции shmdt(). Ей следует передать адрес, возвращаемый функцией shmat(). Если текущий процесс был последним, кто ссылается на сегмент, сегмент удаляется из памяти. Функция exit() и exec() автоматически отключает сегменты.
|