基本概念
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