Распечатка 7.7 Операции с общей памятью POSIX

Предыдущая  Содержание  Следующая V*D*V

Распечатка 7.7.

 

/* shm.c */

 

#include <sys/types.h>

#include <sys/mman.h>

#include <fcntl.h>

 

/* Размер сегмента нашей общей памяти */

#define SHM_SIZE 1024

 

int main(){

  int shm_fd;

  void *vaddr;

 

  /* Получаем дескриптор общей памяти */

  if ((shm_fd = shm_open("my_shm", O_CREAT | O_RDWR, 0666)) ==

                                                          -1){

    perror("cannot open");

    return -1;

  }

 

  /* Устанавливаем размер общей памяти равным SHM_SIZE */

  if (ftruncate(shm_fd, SHM_SIZE) != 0){

    perror("cannot set size");

    return -1;

  }

 

  /*

   * Подключаем общую память в адресное пространство. Флаг

   * MAP_SHARED говорит, что это подключение общей памяти.

   */

  if ((vaddr = mmap(0, SHM_SIZE, PROT_WRITE, MAP_SHARED,

               shm_fd, 0)) == MAP_FAILED){

    perror("cannot mmap");

    return -1;

  }

 

  /* Блокируем общую память. Не забываем про этот шаг */

  if (mlock(vaddr, SHM_SIZE) != 0){

    perror("cannot mlock");

    return -1;

  }

 

  /*

   * Общая память готова к использованию

   */

 

  /*

   * В конце отделяем сегмент общей памяти от адресного

   * пространства. Это также приведёт к разблокировке этого

   * сегмента.

   */

  munmap(vaddr, SHM_SIZE);

  close(shm_fd);

  /* Удаляем сегмент общей памяти */

  shm_unlink("my_shm");

  return 0;

}

 

Предыдущая  Содержание  Следующая