← index
cplusplus11.Examples/UNIX/ipc/posix-shm-create.cpp
Source: cplusplus11.Examples/UNIX/ipc/posix-shm-create.cpp
/* Adapted from "the Linux Programming Interface"
 Chapter 54
 */
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<unistd.h>
#include<cstring>
#include<errno.h>
#include<string>
#include<iostream>

void error(const std::string &text);


int main(int argc, char **argv) {
    
    void *addr;
    
    if(argc != 3) {
        std::cerr << "Error requires two arguments\n" << argv[0] << " path size\n";
        exit(EXIT_FAILURE);
    }
    
    int _fd;
    int size = atoi(argv[2]);
    
    if(size < 0) {
        std::cerr << "Error invalid size\n";
        exit(EXIT_FAILURE);
    }
    
    
    _fd = shm_open(argv[1], O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    
    if(_fd == -1)
        error("shm_open");
    
    
    std::cout << "Truncating to: " << size << "\n";
    
    if(ftruncate(_fd, size) == -1)
        error("ftruncate");
    
    
    addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, _fd, 0);
    
    if(addr == MAP_FAILED)
        error("mmap");
    
    return EXIT_SUCCESS;
}

void error(const std::string &text) {
    std::cerr << "Error: " << text << "\n" << strerror(errno) << "\n";
    exit(EXIT_FAILURE);
}