什么是mmap和shmget

mmapshmget 是用于内存管理的系统调用,常用于进程间通信(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_READPROT_WRITE)。
  • flags:映射类型(如MAP_SHAREDMAP_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_CREATIPC_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:专为共享内存设计,简单易用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值