Introduction
Laymen explanation
Technical exaplanation
SystemV based shared memory
Example
Text Box
#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main ()
{
int segment_id;
char* shared_memory;
struct shmid_ds shmbuffer;
int segment_size;
const int shared_segment_size = 0x20;
/* Allocate a shared memory segment. */
segment_id = shmget (IPC_PRIVATE, shared_segment_size,
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
/* Attach the shared memory segment. */
shared_memory = (char*) shmat (segment_id, 0, 0);
printf ("shared memory attached at address %p\n", shared_memory);
/* Determine the segment's size. */
shmctl (segment_id, IPC_STAT, &shmbuffer);
segment_size = shmbuffer.shm_segsz;
printf ("segment size: %d\n", segment_size);
/* Write a string to the shared memory segment. */
sprintf (shared_memory, "Hello, world.");
/* Detach the shared memory segment. */
shmdt (shared_memory);
/* Reattach the shared memory segment, at a different address. */
shared_memory = (char*) shmat (segment_id, (void*) 0x5000000, 0);
printf ("shared memory reattached at address %p\n", shared_memory);
/* Print out the string from shared memory. */
printf ("%s\n", shared_memory);
/* Detach the shared memory segment. */
shmdt (shared_memory);
/* Deallocate the shared memory segment. */
shmctl (segment_id, IPC_RMID, 0);
return 0;
}
========
output
========
shared memory attached at address 0x7f8f8ee6f000
segment size: 32
shared memory reattached at address 0x5000000
Hello, world.
Use of IPC_CREAT | IPC_EXCL
IPC_CREAT will create the new shared memory segment. IPC_EXCL will ensure that shared memory segment doesn't exist. If exist, shmget will return error.
Useful link: https://stackoverflow.com/questions/11432823/shmget-with-ipc-excl
https://stackoverflow.com/questions/5656530/how-to-use-shared-memory-with-linux-in-c
Reference