mmap
和 shmget
是用于内存管理的系统调用,常用于进程间通信(IPC)和高效文件访问。
1. mmap
mmap
(Memory Map)将文件或设备映射到进程的地址空间,允许像访问内存一样访问文件,避免了频繁的read
/write
系统调用,提升性能。
主要用途:
- 文件映射:将文件映射到内存,方便读写。
- 匿名映射:创建不与文件关联的内存区域,用于进程间共享内存。
- 共享内存:多个进程映射同一文件或匿名区域,实现共享内存。
函数原型:
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数:
addr
:建议的映射起始地址,通常为NULL
,由内核决定。length
:映射区域的长度。prot
:保护模式(如PROT_READ
、PROT_WRITE
)。flags
:映射类型(如MAP_SHARED
、MAP_PRIVATE
)。fd
:文件描述符。offset
:文件偏移量。
返回值:
成功返回映射区域的起始地址,失败返回MAP_FAILED
。
2. shmget
shmget
(Shared Memory Get)用于创建或获取共享内存段,多个进程可通过该段进行通信。
主要用途:
- 创建共享内存段:供多个进程访问。
- 获取已有共享内存段:通过键值获取已创建的共享内存。
函数原型:
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
参数:
key
:共享内存段的键值,IPC_PRIVATE
表示创建新段。size
:共享内存段的大小。shmflg
:标志(如IPC_CREAT
、IPC_EXCL
)。
返回值:
成功返回共享内存标识符,失败返回-1。
对比
- mmap:适用于文件映射和共享内存,灵活性高。
- shmget:专为共享内存设计,接口简单。
示例
mmap 示例:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int fd = open("testfile", O_RDWR);
void *addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
printf("Mapped address: %p\n", addr);
munmap(addr, 4096);
close(fd);
return 0;
}
shmget 示例:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
int main() {
int shmid = shmget(IPC_PRIVATE, 4096, IPC_CREAT | 0666);
printf("Shared memory ID: %d\n", shmid);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
总结
- mmap:适合文件映射和共享内存,灵活。
- shmget:专为共享内存设计,简单易用。