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);
}