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

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

Жанры

Основы программирования в Linux
Шрифт:

Если совместно используемая память создана успешно,

shmget
вернет неотрицательное целое, идентификатор совместно используемой памяти. В случае аварийного завершения функция вернет -1.

shmat

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

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

Функция

shmdt
отсоединяет совместно используемую память от текущего процесса. Она принимает указатель на адрес, возвращенный функцией
shmat
. В случае успеха функция вернет 0, в случае ошибки - -1. Имейте в виду, что отсоединение совместно используемой памяти не уничтожает ее, а только делает эту память недоступной для текущего процесса.

shmctl

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

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
— указатель на структуру, содержащую режимы и права доступа для совместно используемой памяти.

В случае успеха возвращает 0, в случае ошибки — -1. В стандарте X/Open не описано, что произойдет, если вы попытаетесь удалить присоединенный к процессу сегмент совместно используемой памяти. Обычно присоединенный, но удаленный сегмент совместно используемой памяти продолжает функционировать до тех пор, пока не будет отсоединен от последнего процесса. Но поскольку это поведение не задано в стандарте, на него лучше не рассчитывать.

Выполните упражнение 14.2.

Упражнение 14.2. Совместно используемая память

После знакомства с функциями совместно используемой памяти можно написать программу для их использования. В данном упражнении вы напишите пару программ: shm1.c и shm2.c. Первая (потребитель) создаст сегмент разделяемой памяти и затем отобразит любые данные, записанные в него. Вторая (поставщик) присоединит существующий сегмент совместно используемой памяти и позволит вам ввести данные в этот сегмент.

1. Сначала создайте общий заголовочный файл для описания совместно используемой памяти, которую вы хотите предоставить. Назовите его shm_com.h.

#define TEXT_SZ 2048

struct shared_use_st {

 int written_by_you;

 char some_text[TEXT_SZ];

};

В файле определена структура, которая будет применяться в обеих программах: потребителе и поставщике. Вы используете флаг

written_by_you
типа
int
для того, чтобы сообщить потребителю о том, что данные записаны в оставшуюся часть структуры, и произвольно решаете, что необходимо передать до 2 Кбайт текста.

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

Бояръ-Аниме. Газлайтер. Том 33

Володин Григорий Григорьевич
33. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 33

Ваше Сиятельство 14

Моури Эрли
14. Ваше Сиятельство
Фантастика:
боевая фантастика
аниме
фэнтези
гаремник
5.00
рейтинг книги
Ваше Сиятельство 14

#НенавистьЛюбовь

Джейн Анна
Любовные романы:
современные любовные романы
6.33
рейтинг книги
#НенавистьЛюбовь

Камень. Книга 3

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

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.00
рейтинг книги
Дважды одаренный. Том V

Звездная Кровь. Изгой VII

Елисеев Алексей Станиславович
7. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
технофэнтези
рпг
фантастика: прочее
попаданцы
5.00
рейтинг книги
Звездная Кровь. Изгой VII

Железный Воин Империи VII

Зот Бакалавр
7. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Железный Воин Империи VII

Паутина

Макоули Пол Дж.
Фантастика:
детективная фантастика
6.00
рейтинг книги
Паутина

Геном хищника. Книга третья

Гарцевич Евгений Александрович
3. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга третья

Адвокат Империи 2

Карелин Сергей Витальевич
2. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 2

Я снова князь. Книга XXIII

Дрейк Сириус
23. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я снова князь. Книга XXIII

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Лекарь Империи 5

Карелин Сергей Витальевич
5. Лекарь Империи
Фантастика:
городское фэнтези
аниме
героическая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 5

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...