shm.c 1.33 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

#define TERMINATE_SHM "/terminate"
#define TERMINATE_SHM_SIZE 8

void* open_shm(char *shm_name, size_t shm_size) {
    int shmfd = shm_open(shm_name, O_RDWR | O_CREAT, 0600);
    if(shmfd == -1) {
Ivaylo Ivanov's avatar
Ivaylo Ivanov committed
16
        fprintf(stderr, "ERROR: Failed creating shared memory object\n");
17 18 19 20
        exit(EXIT_FAILURE);
    }

    if(ftruncate(shmfd, shm_size) < 0) {
Ivaylo Ivanov's avatar
Ivaylo Ivanov committed
21
        fprintf(stderr, "ERROR: Failed truncating shared memory object\n");
22 23 24 25 26 27 28
        exit(EXIT_FAILURE);
    }

    void* shm;
    shm = mmap(NULL, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0);

    if(shm == MAP_FAILED) {
Ivaylo Ivanov's avatar
Ivaylo Ivanov committed
29
        fprintf(stderr, "ERROR: Failed mapping shared memory object\n");
30 31 32 33 34 35 36 37 38 39 40 41
        exit(EXIT_FAILURE);
    }

    return shm;
}

void write_to_shm(void* shm, char *message, size_t message_size) {
    memcpy(shm, message, message_size);
}

void close_shm(void* shm, size_t shm_size) {
    if (munmap(shm, shm_size) == -1) {
Ivaylo Ivanov's avatar
Ivaylo Ivanov committed
42
        fprintf(stderr, "ERROR: Failed unmapping shared memory object\n");
43 44 45 46 47 48
        exit(EXIT_FAILURE);
    }
}

void destroy_shm(char *shm_name) {
    if (shm_unlink(shm_name) == -1) {
Ivaylo Ivanov's avatar
Ivaylo Ivanov committed
49
        fprintf(stderr, "ERROR: Failed unlinking shared memory object\n");
50 51 52
        exit(EXIT_FAILURE);
    }
}