mmap
和 shm
(共享内存)是 Linux 系统中用于进程间通信(IPC)和内存管理的两种技术。
mmap(Memory Mapping)
基础概念:
mmap
是一种将文件或设备映射到进程的地址空间的方法。通过 mmap
,进程可以将文件的内容映射到内存中,然后像访问普通内存一样访问文件的内容。这种方式可以简化文件操作,提高 I/O 性能。
优势:
类型:
应用场景:
shm(Shared Memory)
基础概念: 共享内存是一种进程间通信方式,允许多个进程访问同一块物理内存区域。共享内存是最快的 IPC 方式,因为它避免了数据在进程间的复制。
优势:
类型:
shmget
、shmat
等系统调用创建和访问。shm_open
、mmap
等函数创建和访问。应用场景:
问题解决
如果在使用 mmap
或 shm
时遇到问题,可能的原因包括:
解决方法:
示例代码(使用 POSIX 共享内存)
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
int main() {
int shm_fd = shm_open("/my_shm", 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);
}
// 映射共享内存
int *ptr = mmap(0, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
exit(1);
}
// 写入数据
*ptr = 42;
// 读取数据
printf("Shared memory value: %d
", *ptr);
// 解除映射
if (munmap(ptr, sizeof(int)) == -1) {
perror("munmap");
exit(1);
}
// 删除共享内存
if (shm_unlink("/my_shm") == -1) {
perror("shm_unlink");
exit(1);
}
return 0;
}
这段代码展示了如何创建、映射、使用和删除 POSIX 共享内存。在实际应用中,还需要考虑同步和错误处理等问题。
领取专属 10元无门槛券
手把手带您无忧上云