如何利用Linux的mmap实现共享内存?

基本概念

1、共享内存:共享内存是一种进程间通信(IPC)方式,允许多个进程访问同一块物理内存区域,这种方式因为数据不需要来回复制,所以是最快的一种进程间通信机制。

2、mmap:mmap是一种内存映射机制,它允许将文件或设备的一部分映射到进程的虚拟内存空间,通过使用mmap,进程可以直接访问被映射对象的内容,而无需进行传统的读取和写入操作。

如何利用Linux的mmap实现共享内存?插图1
(图片来源网络,侵删)

函数介绍

1、shm_open:用于创建或打开共享内存文件,参数包括文件名、文件操作属性和文件共享模式。

2、mmap:用于将文件映射到内存,参数包括映射地址、长度、保护属性、标志位、文件描述符和偏移量。

3、munmap:用于取消内存映射。

4、shm_unlink:用于删除共享内存文件。

5、ftruncate:用于改变文件的大小。

如何利用Linux的mmap实现共享内存?插图3
(图片来源网络,侵删)

共享内存与mmap的关系

共享内存可以通过mmap实现,也可以通过系统V共享内存机制实现,mmap提供了两种映射方式:普通文件提供的内存映射和特殊文件提供的匿名内存映射。

mmap的使用

1、普通文件内存映射:适用于任何进程之间,需要打开或创建一个文件,然后调用mmap。

2、匿名内存映射:适用于具有亲缘关系的进程之间,例如父子进程,父进程先调用mmap,然后调用fork,子进程继承父进程的映射区域。

优缺点

1、优点:读写效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。

2、缺点:存储量不能非常大,因为共享的是实际物理存储器里的内存。

如何利用Linux的mmap实现共享内存?插图5
(图片来源网络,侵删)

示例代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
int main() {
    const char *name = "shared_memory";
    const int SIZE = 4096;
    // 创建或打开共享内存文件
    int shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
    if (shm_fd == -1) {
        perror("shm_open");
        exit(1);
    }
    // 调整文件大小
    if (ftruncate(shm_fd, SIZE) == -1) {
        perror("ftruncate");
        exit(1);
    }
    // 映射到内存
    void *ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
    if (ptr == MAP_FAILED) {
        perror("mmap");
        exit(1);
    }
    // 写入数据
    sprintf(ptr, "Hello, shared memory!");
    // 取消映射
    munmap(ptr, SIZE);
    close(shm_fd);
    // 删除共享内存文件
    shm_unlink(name);
    return 0;
}

Linux下的共享内存和mmap提供了一种高效的进程间通信方式,通过合理使用这些函数和机制,可以实现快速的数据传输和共享。

小伙伴们,上文介绍linux 共享内存 mmap的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。

本文来源于互联网,如若侵权,请联系管理员删除,本文链接:https://www.9969.net/67586.html

小末小末
上一篇 2024年10月4日 08:31
下一篇 2024年10月4日 08:46

相关推荐