In the previous chapter we learned about SYS V Shared Memory. In this chapter we shall learn about POSIX Shared Memory.
You need to include below header file for using Shared Memory:
#include <sys/mman.h>
Important functions for using shared memory are:
1. mmap()
void *mmap( void *addr, size_t len, int prot, int flags, int fildes, off_t off );
This function is used to address a memory object.
2. mprotect()
int mprotect( void *addr, size_t len, int prot );
This function is used to change memory protection.
3. munmap()
int munmap( void *addr, size_t len );
This function is used to unmap the memory address that is previously mapped.
4. shm_open()
int shm_open( const char *name, int oflag, mode_t mode );
This function is used to open a shred memory object.
5. shm_unlink()
int shm_unlink( const char *name );
This function is used to remove a shared memory object.
Example for POSIX Shared Memory:
write.c
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define FILE_PATH "/my_shm_test"
int main(int argc, char *argv[])
{
int res;
int fd;
int len;
void *addr;
char data[256] = "Hello World";
// get shared memory file descriptor
fd = shm_open(FILE_PATH, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
// increase the size
res = ftruncate(fd, 256);
// map shared memory
addr = mmap(NULL, 256, PROT_WRITE, MAP_SHARED, fd, 0);
// place data into memory
len = strlen(data) + 1;
memcpy(addr, data, len);
sleep(2);
// mmap cleanup
res = munmap(addr, 256);
// shm_open cleanup
fd = shm_unlink(FILE_PATH);
return 0;
}
read.c
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define FILE_PATH "/my_shm_test"
int main(int argc, char *argv[])
{
int res;
int fd;
char data[256];
void *addr;
// get shared memory file descriptor
fd = shm_open(FILE_PATH, O_RDONLY, S_IRUSR | S_IWUSR);
if (fd == -1)
{
perror("open");
return 10;
}
// map shared memory
addr = mmap(NULL, 256, PROT_READ, MAP_SHARED, fd, 0);
// place data into memory
memcpy(data, addr, 256);
printf("Read from shared memory: \"%s\"\n", data);
return 0;
}