Experimenting with shared memory

I have just been testing a couple of programs with shared memory. One using SYSV shared memory and one using POSIX shared memory.

 

This first program is for SYSV shared memory:

#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
	int id = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666);
	if (id == -1)
	{
		std::cout << "shmget failed: " << std::strerror(errno) << '\n';
		return 1;
	}

	void* ptr = shmat(id, nullptr, 0);
	if (ptr == reinterpret_cast<void*>(-1))
	{
		std::cout << "shmat failed: " << std::strerror(errno) << '\n';
		return 1;
	}

	int* counter_ptr = reinterpret_cast<int*>(ptr);
	*counter_ptr = 123;

	pid_t pid = fork();
	if (pid == -1)
	{
		std::cout << "fork failed: " << std::strerror(errno) << '\n';
		return 1;
	}
	else if (pid == 0)
	{
		*counter_ptr = 321;
	}
	else
	{
		// Parent process

		int status = 0;
		waitpid(pid, &status, 0);

		std::cout << "Counter: " << *counter_ptr << '\n';
	}
}

The second program uses POSIX shared memory, and is very similar to the first:

#include <iostream>
#include <cstring>
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
	void* ptr = mmap(nullptr, sizeof(int), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
	if (ptr == MAP_FAILED)
	{
		std::cout << "mmap failed: " << std::strerror(errno) << '\n';
		return 1;
	}

	int* counter_ptr = reinterpret_cast<int*>(ptr);
	*counter_ptr = 123;

	pid_t pid = fork();
	if (pid == -1)
	{
		std::cout << "fork failed: " << std::strerror(errno) << '\n';
		return 1;
	}
	else if (pid == 0)
	{
		// Child process
		*counter_ptr = 321;
	}
	else
	{
		// Parent process

		int status = 0;
		waitpid(pid, &status, 0);

		std::cout << "counter = " << *counter_ptr << '\n';
	}
}

 

Leave a comment