A2oz

How Do I Create a Shared Memory Segment in Linux?

Published in Operating Systems 2 mins read

You can create a shared memory segment in Linux using the System V IPC (Inter-Process Communication) mechanism. This involves using the shmget(), shmat(), and shmdt() system calls.

1. Creating a Shared Memory Segment

The shmget() system call creates a shared memory segment. It takes three arguments:

  • key: A unique identifier for the segment.
  • size: The size of the segment in bytes.
  • flags: Flags specifying the segment's permissions and creation mode.
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);

2. Attaching to the Shared Memory Segment

Once created, you can attach to the shared memory segment using the shmat() system call. This function maps the segment into your process's address space.

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);

3. Detaching from the Shared Memory Segment

When you are finished using the shared memory segment, you should detach from it using the shmdt() system call.

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmdt(const void *shmaddr);

4. Example

Here is a simple example of creating and using a shared memory segment in C:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHM_KEY 12345

int main() {
  // Create a shared memory segment
  int shmid = shmget(SHM_KEY, 1024, IPC_CREAT | 0666);
  if (shmid == -1) {
    perror("shmget");
    exit(1);
  }

  // Attach to the shared memory segment
  char *shm = (char *)shmat(shmid, NULL, 0);
  if (shm == (char *)-1) {
    perror("shmat");
    exit(1);
  }

  // Write data to the shared memory segment
  sprintf(shm, "Hello, world!");

  // Detach from the shared memory segment
  if (shmdt(shm) == -1) {
    perror("shmdt");
    exit(1);
  }

  return 0;
}

5. Practical Insights

  • Key Generation: The ftok() system call can be used to generate a unique key from a file path and a project ID.
  • Permissions: The shmflg argument in shmget() and shmat() controls the permissions and creation mode of the shared memory segment.
  • Memory Management: It is important to manage the shared memory segment carefully, ensuring that it is properly detached and removed when no longer needed.

Related Articles