Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void shm_init()
- {
- if (!attach_shm())
- create_shm();
- }
- /* Attach existing shared memory segment */
- int attach_shm()
- {
- int fd = shm_open(SHM_NAME, O_RDWR, 0);
- if (fd == -1) return 0; /* Doesn't exist yet... */
- /* Sanity check, make sure it has the right size ... */
- struct stat st;
- if (stat("/dev/shm/" SHM_NAME, &st) != 0) fail("/dev/shm/" SHM_NAME);
- assert(st.st_size == sizeof(struct sched_shm));
- shm = mmap(0, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- if (shm == MAP_FAILED) fail("mmap");
- assert(shm->magic == SHM_MAGIC);
- assert(shm->size == shm_size);
- assert(shm->ready);
- return 1;
- }
- /* Create new shared memory segment */
- void create_shm()
- {
- int fd = shm_open(SHM_NAME, O_RDWR | O_CREAT | O_TRUNC, 0644);
- assert(fd != -1);
- int r = ftruncate(fd, shm_size); assert(r == 0);
- void *pt = mmap(0, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- assert(pt != MAP_FAILED);
- shm = pt;
- memset(shm, 0, sizeof(*shm));
- shm->size = shm_size;
- shm->magic = SHM_MAGIC;
- /* init code ... */
- shm->ready = 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement