Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2018
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.23 KB | None | 0 0
  1. void shm_init()
  2. {
  3.         if (!attach_shm())
  4.                 create_shm();
  5. }
  6.  
  7. /* Attach existing shared memory segment */
  8. int attach_shm()
  9. {
  10.         int fd = shm_open(SHM_NAME, O_RDWR, 0);
  11.         if (fd == -1)  return 0;  /* Doesn't exist yet... */
  12.  
  13.         /* Sanity check, make sure it has the right size ... */
  14.         struct stat st;
  15.         if (stat("/dev/shm/" SHM_NAME, &st) != 0)  fail("/dev/shm/" SHM_NAME);
  16.         assert(st.st_size == sizeof(struct sched_shm));
  17.  
  18.         shm = mmap(0, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  19.         if (shm == MAP_FAILED)  fail("mmap");
  20.  
  21.         assert(shm->magic == SHM_MAGIC);
  22.         assert(shm->size == shm_size);
  23.         assert(shm->ready);
  24.         return 1;
  25. }
  26.  
  27. /* Create new shared memory segment */
  28. void create_shm()
  29. {
  30.        int fd = shm_open(SHM_NAME, O_RDWR | O_CREAT | O_TRUNC, 0644);
  31.        assert(fd != -1);
  32.        int r = ftruncate(fd, shm_size);  assert(r == 0);
  33.        void *pt = mmap(0, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  34.        assert(pt != MAP_FAILED);
  35.  
  36.        shm = pt;
  37.        memset(shm, 0, sizeof(*shm));
  38.        shm->size = shm_size;
  39.        shm->magic = SHM_MAGIC;
  40.  
  41.        /* init code ... */
  42.        shm->ready = 1;
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement