Задание 8: разделяемая память
Требуемые условия завершения
Открыто с: суббота, 30 апреля 2016, 11:00
Срок сдачи: вторник, 10 мая 2016, 23:00
Задание
Модифицировать программы из задания про именованные каналы для пересылки данных через разделяемую память. Доступ к разделяемому сегменту должен синхронизироваться при помощи семафоров.
Полезные заголовки
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
Полезные функции
Создание или открытие объекта разделяемой памяти:
int shm_open(const char *name, int oflag, mode_t mode);
Удаление объекта разделяемой памяти:
int shm_unlink(const char *name);
Установка размера объекта разделяемой памяти:
int ftruncate(int fd, off_t length);
Отображение файла или объекта разделяемой памяти в адресное пространство процесса:
void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
Удаление отображения:
int munmap(void *addr, size_t length);
Полезные ссылки
- http://linux.die.net/man/7/shm_overview
- http://habrahabr.ru/post/122108/
- http://dmilvdv.narod.ru/Translate/ELSDD/elsdd_posix_shared_memory.html
- http://www.opennet.ru/man.shtml?topic=shm_open&category=3&russian=0
- http://pubs.opengroup.org/onlinepubs/009695399/functions/shm_open.html
Примерная схема работы
#include <unistd.h>
#include <sys/mman.h>
...
#define MAX_LEN 10000
struct region /* Определение структуры разделяемой памяти */
{
int len;
char buf[MAX_LEN];
};
int main()
{
struct region *rptr;
int fd;
/* Создание объекта разделяемой памяти и установка его размера
*/
fd = shm_open(
"/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (fd == -1)
/* Обработка ошибки */ ;
if (ftruncate(fd, sizeof(struct region)) == -1)
/* Обработка ошибки */ ;
/* Отображение объекта разделяемой памяти */
rptr = mmap(
NULL, sizeof(struct region),
PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (rptr == MAP_FAILED)
/* Обработка ошибки */ ;
/* Теперь можно обращаться к отображённой области через поля
rptr; например, rptr->len
*/
...
}