共享内存可以两个或多个进程通过将相同的物理内存区域映射到它们的地址空间来进行通信。这通常用于需要快速交换大量数据的进程间通信(IPC)场景。共享内存是一个强大的进程间通信机制,在Linux中使用C语言非常简单。通过 shmget、shmat、shmdt 和 shmctl 系统调用,进程可以高效地共享数据。这种方式通常用于进程间需要快速交换大量数据的场景。

1、共享内存生产者(写入者)

在Linux中,使用共享内存通常通过 shmgetshmatshmdt 系统调用来实现。这些系统调用用于创建共享内存段、将其附加到进程的地址空间以及在不再需要时将其分离。

生产者进程创建一个共享内存段,将数据写入共享内存中。

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

#define SHM_KEY 1234 // 共享内存键值
#define SHM_SIZE 1024 // 共享内存段的大小

int main() {
    // 创建共享内存段
    int shm_id = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666);
    if (shm_id == -1) {
        perror("shmget失败");
        exit(1);
    }

    // 将共享内存段附加到进程的地址空间
    char *shm_ptr = (char *)shmat(shm_id, NULL, 0);
    if (shm_ptr == (char *)-1) {
        perror("shmat失败");
        exit(1);
    }

    // 向共享内存写入数据
    strcpy(shm_ptr, "Hello from shared memory!");

    printf("写入者: 数据写入共享内存: %s\n", shm_ptr);

    // 分离共享内存
    if (shmdt(shm_ptr) == -1) {
        perror("shmdt失败");
        exit(1);
    }

    return 0;
}

2、共享内存消费者(读取者)

消费者进程读取共享内存中的数据并显示。

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

#define SHM_KEY 1234 // 共享内存键值
#define SHM_SIZE 1024 // 共享内存段的大小

int main() {
    // 访问共享内存段
    int shm_id = shmget(SHM_KEY, SHM_SIZE, 0666);
    if (shm_id == -1) {
        perror("shmget失败");
        exit(1);
    }

    // 将共享内存段附加到进程的地址空间
    char *shm_ptr = (char *)shmat(shm_id, NULL, 0);
    if (shm_ptr == (char *)-1) {
        perror("shmat失败");
        exit(1);
    }

    // 从共享内存读取数据
    printf("读取者: 从共享内存读取的数据: %s\n", shm_ptr);

    // 分离共享内存
    if (shmdt(shm_ptr) == -1) {
        perror("shmdt失败");
        exit(1);
    }

    return 0;
}