基本概念
1、共享内存:共享内存是一种进程间通信(IPC)方式,允许多个进程访问同一块物理内存区域,这种方式因为数据不需要来回复制,所以是最快的一种进程间通信机制。
2、mmap:mmap是一种内存映射机制,它允许将文件或设备的一部分映射到进程的虚拟内存空间,通过使用mmap,进程可以直接访问被映射对象的内容,而无需进行传统的读取和写入操作。

函数介绍
1、shm_open:用于创建或打开共享内存文件,参数包括文件名、文件操作属性和文件共享模式。
2、mmap:用于将文件映射到内存,参数包括映射地址、长度、保护属性、标志位、文件描述符和偏移量。
3、munmap:用于取消内存映射。
4、shm_unlink:用于删除共享内存文件。
5、ftruncate:用于改变文件的大小。

共享内存与mmap的关系
共享内存可以通过mmap实现,也可以通过系统V共享内存机制实现,mmap提供了两种映射方式:普通文件提供的内存映射和特殊文件提供的匿名内存映射。
mmap的使用
1、普通文件内存映射:适用于任何进程之间,需要打开或创建一个文件,然后调用mmap。
2、匿名内存映射:适用于具有亲缘关系的进程之间,例如父子进程,父进程先调用mmap,然后调用fork,子进程继承父进程的映射区域。
优缺点
1、优点:读写效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。
2、缺点:存储量不能非常大,因为共享的是实际物理存储器里的内存。

示例代码
#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