Чтение онлайн

на главную - закладки

Жанры

Шрифт:

1. Если аргумент

shmaddr
нулевой, то система самостоятельно выбирает адрес.

2. Если аргумент

shmaddr
отличен от нуля, значение возвращаемого адреса зависит от наличия флажка
SHM_RND
в аргументе
shmflag
:

 • Если флажок

SHM_RND
не установлен, система присоединяет разделяемую память к указанному
shmaddr
адресу.

 • Если флажок

SHM_RND
установлен, система присоединяет разделяемую память к адресу, полученному округлением в меньшую сторону
shmaddr
до некоторой определенной величины
SHMLBA
.

По умолчанию разделяемая память присоединяется с правами на чтение и запись. Эти права можно изменить, указав флажок

SHM_RDONLY
в аргументе
shmflag
.

Таким образом, несколько процессов могут отображать область разделяемой памяти в различные участки собственного виртуального адресного пространства, как это показано на рис. 3.20.

Рис. 3.20. Совместное использование разделяемой памяти

Окончив работу с разделяемой памятью, процесс отключает (detach) область вызовом shmdt(2):

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

int shmdt(char *shmaddr);

При работе с разделяемой памятью необходимо синхронизировать выполнение взаимодействующих процессов: когда один из процессов записывает данные в разделяемую память, остальные процессы ожидают завершения операции. Обычно синхронизация обеспечивается с помощью семафоров, назначение и число которых определяется конкретным использованием разделяемой памяти.

Можно привести примерную схему обмена данными между двумя процессами (клиентом и сервером) с использованием разделяемой памяти. Для синхронизации процессов использована группа из двух семафоров. Первый семафор служит для блокирования доступа к разделяемой памяти, его разрешающий сигнал — 0, а 1 является запрещающим сигналом. Второй семафор служит для сигнализации серверу о том, что клиент начал работу. Необходимость применения второго семафора обусловлена следующими обстоятельствами: начальное состояние семафора, синхронизирующего работу с памятью, является открытым (0), и вызов сервером операции заблокирует обращение к памяти для клиента. Таким образом, сервер должен вызвать операцию

mem_lock
только после того, как разделяемую память заблокирует клиент. Назначение второго семафора заключается в уведомлении сервера, что клиент начал работу, заблокировал разделяемую память и начал записывать данные в эту область. Теперь, при вызове сервером операции mem_lock его выполнение будет приостановлено до освобождения памяти клиентом, который делает это после окончания записи строки "Здравствуй, Мир!".

shmem.h:

#define MAXBUFF 80

#define PERM 0666

/* Структура данных в разделяемой памяти */

typedef struct mem_msg {

 int segment;

 char buff[MAXBUFF];

} Message;

/* Ожидание начала выполнения клиента */

static struct sembuf proc_wait[1] = { 1, -1, 0 };

/*
Уведомление сервера о том, что клиент начал работу */

static struct sembuf proc_start[1] = {

 1, 1, 0

};

/* Блокирование разделяемой памяти */

static struct sembuf mem_lock[2] = {

 0, 0, 0,

 0, 1, 0

};

/* Освобождение ресурса */

static struct sembuf mem_unlock[1] = {

 0, -1, 0

};

Сервер:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <sys/shm.h>

#include "shmem.h"

main {

 Message* msgptr;

 key_t key;

 int shmid, semid;

 /* Получим ключ, Один и тот же ключ можно использовать как

для семафора, так и для разделяемой памяти */

 if ((key = ftok("server", 'A')) < 0) {

printf("Невозможно получить ключ\n");

exit(1);

 }

 /* Создадим область разделяемой памяти */

 if ((shmid = shmget(key, sizeof(Message),

PERM | IPC_CREAT)) < 0) {

printf("Невозможно создать область\n");

exit(1);

 }

 /* Присоединим ее */

 if ((msgptr = (Message*)shmat(shmid, 0, 0)) < 0) {

printf("Ошибка присоединения\n");

exit(1);

 }

 /* Создадим группу из двух семафоров:

Первый семафор - для синхронизации работы

с разделяемой памятью. Второй семафор -

для синхронизации выполнения процессов */

 if ((semid = semget(key, 2, PERM | IPC_CREAT)) < 0) {

printf("Невозможно создать семафор\n");

exit(1);

 }

 /* Ждем, пока клиент начнет работу и заблокирует разделяемую память */

 if (semop(semid, &proc_wait[0], 1) < 0) {

printf("Невозможно выполнить операции\n");

exit(1);

 }

Поделиться:
Популярные книги

Блуждающие огни 4

Панченко Андрей Алексеевич
4. Блуждающие огни
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Блуждающие огни 4

Я сделаю это сама

Кальк Салма
1. Магический XVIII век
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я сделаю это сама

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

Боярышня Дуняша

Меллер Юлия Викторовна
1. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Дуняша

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Леди для короля. Оборотная сторона короны

Воронцова Александра
3. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Леди для короля. Оборотная сторона короны

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

Невест так много. Дилогия

Завойчинская Милена
Невест так много
Любовные романы:
любовно-фантастические романы
7.62
рейтинг книги
Невест так много. Дилогия

Идеальный мир для Социопата 3

Сапфир Олег
3. Социопат
Фантастика:
боевая фантастика
6.17
рейтинг книги
Идеальный мир для Социопата 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Наследник павшего дома. Том I

Вайс Александр
1. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том I

Крещение огнем

Сапковский Анджей
5. Ведьмак
Фантастика:
фэнтези
9.40
рейтинг книги
Крещение огнем

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая