linux

Linux进程间如何共享内存

小樊
55
2025-07-23 04:53:50
栏目: 智能运维

在Linux中,进程间可以通过多种方式共享内存。以下是一些常用的方法:

  1. POSIX共享内存(shm_open, shm_unlink, mmap等函数): POSIX共享内存是一种基于文件的共享内存机制,它允许不同的进程映射同一个文件到它们的地址空间。这样,这些进程就可以访问和修改共享的数据。

示例代码:

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    const char *name = "/my_shared_memory";
    int shm_fd;
    void *ptr;

    // 创建或打开共享内存对象
    shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
    if (shm_fd == -1) {
        perror("shm_open");
        exit(1);
    }

    // 设置共享内存大小
    if (ftruncate(shm_fd, sizeof(int)) == -1) {
        perror("ftruncate");
        exit(1);
    }

    // 映射共享内存到进程地址空间
    ptr = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
    if (ptr == MAP_FAILED) {
        perror("mmap");
        exit(1);
    }

    // 写入数据
    int value = 42;
    memcpy(ptr, &value, sizeof(value));

    // 清理资源
    munmap(ptr, sizeof(int));
    close(shm_fd);
    shm_unlink(name);

    return 0;
}
  1. System V共享内存(shmget, shmat, shmdt等函数): System V共享内存是另一种共享内存机制,它使用一个唯一的键来标识共享内存段。进程可以通过这个键来访问共享内存。

示例代码:

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

int main() {
    key_t key = 123456;
    int shmid;
    int *ptr;

    // 创建或获取共享内存段
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    if (shmid == -1) {
        perror("shmget");
        exit(1);
    }

    // 映射共享内存到进程地址空间
    ptr = shmat(shmid, NULL, 0);
    if (ptr == (void *) -1) {
        perror("shmat");
        exit(1);
    }

    // 写入数据
    int value = 42;
    memcpy(ptr, &value, sizeof(value));

    // 清理资源
    shmdt(ptr);
    shmctl(shmid, IPC_RMID, NULL);

    return 0;
}
  1. 内存映射文件(mmap系统调用): 内存映射文件是一种将文件或其他对象映射到进程地址空间的方法。这样,进程就可以像访问普通内存一样访问文件数据。这种方法也可以用于实现进程间共享内存。

示例代码:

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    const char *filename = "my_shared_memory_file";
    int fd;
    void *ptr;

    // 创建或打开文件
    fd = open(filename, O_RDWR | O_CREAT, 0666);
    if (fd == -1) {
        perror("open");
        exit(1);
    }

    // 设置文件大小
    if (ftruncate(fd, sizeof(int)) == -1) {
        perror("ftruncate");
        exit(1);
    }

    // 映射文件到进程地址空间
    ptr = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (ptr == MAP_FAILED) {
        perror("mmap");
        exit(1);
    }

    // 写入数据
    int value = 42;
    memcpy(ptr, &value, sizeof(value));

    // 清理资源
    munmap(ptr, sizeof(int));
    close(fd);

    return 0;
}

这些方法都可以实现Linux进程间共享内存。你可以根据你的需求选择合适的方法。

0
看了该问题的人还看了