Задание 8: разделяемая память

Задание

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

Полезные заголовки

#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);
    

Полезные ссылки

Примерная схема работы

#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
  */
  ...
}