- •Введение
- •Глава 1. Фундаментальные концепции unix Систем
- •Программы, процессы и потоки
- •Сигналы
- •Идентификаторы процессов, группы процессов и сеансы
- •Система прав
- •Другие атрибуты процесса
- •Межпроцессное взаимодействие
- •Использование системных вызовов
- •Краткие описания функций и обработка ошибок
- •Контрольные вопросы
- •Литература
- •Глава 2. Базовые операции ввода-вывода
- •Файловые операции ввода - вывода
- •Стандартные дескрипторы
- •Системные вызовы open и creat
- •Системный вызов umask
- •Системный вызов unlink
- •Текущая позиция в файле
- •Системный вызов write
- •2.8. Системный вызов read
- •2.9. Системный вызов close
- •2.10. Системный вызов lseek
- •2.11. Системные вызовы pread и pwrite
- •2.12. Системные вызовы truncate и ftruncate
- •Контрольные вопросы
- •Литература
- •Глава 3. Дополнительные операции файлового ввода_вывода
- •Низкоуровневый доступ к файловой системе
- •Жесткие и символические ссылки
- •Системный вызов getcwd
- •Отображение метаданных файла
- •Системные вызовы getpwuid, getgrgid и getlogin
- •Каталоги
- •Системные вызовы chdir и fchdir
- •Системные вызовы mkdir и rmdir
- •Контрольные вопросы
- •Литература
- •Глава 4. Процессы и потоки
- •4.1. Среда окружения
- •Системный вызов exec
- •Системный вызов fork
- •Завершение процесса и системные вызовы exit
- •Системные вызовы wait, waitpid и waitid
- •Получение и изменение идентификаторов пользователя и группы
- •Получение и изменение приоритета
- •Контрольные вопросы
- •Литература
- •Глава 5. Механизмы межпроцессного взаимодействия
- •5.1. Каналы
- •5.2. Системные вызовы dup и dup2
- •5.3. Двунаправленное взаимодействие с использованием однонаправленных каналов
- •Контрольные вопросы
- •Литература
- •Глава 6.Механизмы взаимодействия процессов
- •Именованные каналы (fifo)
- •Системные вызовы для работы с очередями сообщений posix
- •Семафоры
- •Системные вызовы для работы с общей памятью posix
- •Контрольные вопросы
- •Литература
- •Глава 7.Сетевое взаимодействие и сокеты
- •Основные системные вызовы для работы с сокетами, образующими логические соединения
- •Обслуживание нескольких клиентов
- •Адресация сокетов
- •In_port_t sin_port; /* номер порта (uint16_t) */
- •In_addr_t s_addr; /* адрес iPv4 (uint32_t) */
- •Домен адресов af_inet6
- •In_port_t sin6_port; /* номер порта (uint16_t) */
- •Доменная система именования
- •Параметры сокетов
- •Контрольные вопросы
- •Литература
- •Глава 8.Сигналы и таймеры
- •Введение в сигналы
- •Жизненный цикл сигналов
- •Типы сигналов
- •Системный вызов sigaction
- •Контрольные вопросы
- •Литература
- •Заключение
- •Список литературы
- •Глава 2. Базовые операции ввода-вывода 14
- •Глава 3. Дополнительные операции файлового ввода_вывода 25
- •Глава 6. Механизмы взаимодействия процессов 58
Системные вызовы для работы с общей памятью posix
Ниже приводится краткое описание системных вызовов имеющих непосредственное отношение к общей памяти:
shm_open - открывает объект разделяемой памяти
#include <sys/mman.h>
int shm_open (
const char *name, /* имя POSIX IPC*/
int flags, /* флаги */
mode_t perms /* права доступа */
);
/* Возвращает файловый дескриптор или -1 в случае ошибки (код ошибки - в errno) */
shm_unlink - удаляет объект разделяемой памяти
#include <sys/mman.h>
int shm_ unlink (
const char *name /* имя POSIX IPC*/
);
/* Возвращает 0 в случае успеха или -1 в случае ошибки (код ошибки - в errno) */
Не следует использовать флаг O_WRONLY. В случае создания нового объекта в третьем аргументе передаются права доступа к объекту. Как и другие объекты взаимодействия процессов, сегмент общей памяти POSIX остается в системе после его закрытия, по крайней мере, до перезагрузки системы. По окончании работы с дескриптором он может быть закрыт обычным системным вызовом close, как и любой другой файловый дескриптор. После создания сегмента общей памяти производится установка его размера вызовом ftruncate, поскольку изначально он имеет нулевую длину:
ftruncate - изменяет размер файла, заданного дескриптором
#include <unistd.h>
int ftruncate (
int fd, /* дескриптор файла*/
off_t length /* новый размер файла*/
);
/* Возвращает 0 в случае успеха или -1 в случае ошибки (код ошибки - в errno) */
Для отображения сегмента в адресное пространство процесса используется системный вызов mmap:
mmap - отображает страницы памяти в адресное пространство процесса
#include <sys/mman.h>
void *mmap (
void *addr, /* желаемый адрес отображения или NULL*/
size_t len, /* размер сегмента*/
int prot, /* защита сегмента*/
int flags, /* флаги */
int fd, /* дескриптор файла*/
off_t off /* смещение в файле или в объекте разделяемой памяти*/
);
/* Возвращает указатель на сегмент или MAP_FAILED в случае ошибки (код ошибки - в errno) */
С помощью аргумента addr можно указать начальный адрес, в который следует отобразить сегмент общей памяти, при этом аргумент flags должен содержать флаг MAP_FIXED. В противном случае этот аргумент должен иметь значение NULL. Аргумент prot может содержать либо значение PROT_NONE, что означает полную недоступность объекта, либо комбинацию из следующих флагов, объединенных по ИЛИ:
PROT_READ - объект доступен для чтения;
PROT_WRITE – объект доступен для записи;
PROT_EXEC - объект доступен для исполнения.
Чтобы подготовить сегмент общей памяти для чтения-записи, нужно выполнить следующую последовательность:
ftruncate(fd, len);
mem = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
ec_cmp(mem, MAP_FAILED)
Главное преимущество общей памяти POSIX заключается в наличии системного вызова mmap, который может отобразить в адресное пространство процесса любой обычный файл, а не только объект общей памяти. Имеется возможность отобразить в память не весь объект, а только часть его. Ключевой недостаток общей памяти POSIX – эта реализация доступна не на всех системах. Например, ее нет в Linux, FreeBSD и Darwin.