POSIX Shared Memory

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

 

Write a Comment

Leave a Comment

Your email address will not be published. Required fields are marked *