浅析Linux进程间通信方式之磁盘映射(mmap)

本文详细介绍了mmap在进程通信中的使用,包括映射区的建立、权限设置、拓展文件大小以及注意事项,如偏移量、共享模式、文件操作的先后顺序等。
摘要由CSDN通过智能技术生成

作用

一对多或者多对多进行进程通信。


特点

  1. 支持磁盘文件匿名映射;
  2. 效率高;
  3. 消息可自定义格式;
  4. 消息传递需要实时传递(由于是修改地址内容来传递消息,如果无及时读取,之前消息会被覆盖)。

使用

建立映射区

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 ((void *) -1)

释放映射区

int munmap(void *addr, size_t length);


addr 映射区的首地址
length 映射区的长度
返回值
成功 返回0
失败 返回 -1

关于mmap需要思考的问题

如果文件偏移量随便填个数会怎么样?
如果文件描述符先关闭,对mmap映射有没有影响?
如果更改mem变量的地址,释放的时候munmap,传入mem还能成功吗?
如果对mem越界操作会怎么样?
open的时候,可以新创建一个文件来创建映射区吗?
open文件选择O_WRONLY,可以吗?
当选择MAP_SHARED的时候,open文件选择O_RDONLY,prot可以选择PROT_READ|PROT_WRITE吗?

拓展文件大小

int truncate(const char *path, off_t length);


path 要拓展的文件
length 要拓展的长度

实例

//mmapsend.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
    int fd = open("./a.txt",O_RDWR);

    void *str = mmap(NULL,1024,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    // 写入数据
    strcpy(str,"hello world");
    return 0;
}
//mmaprcv.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
int main()
{
    int fd = open("./a.txt",O_RDWR|O_CREAT,0777);

    void *str = mmap(NULL,1024,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    printf("%s\n",(char*)str);
    return 0;
}


注意

  • 文件a.txt一般需要存在且不能为空文件;如果想创建文件,需要使用文件拓展函数进行文件拓展
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
int main()
{
    int fd = open("./a.txt",O_RDWR);
    if(fd<0)
    {
        fd = open("./a.txt",O_RDWR|O_CREAT,0666);
        truncate("./a.txt",1024);//文件大小拓展
    }

    void *str = mmap(NULL,1024,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    printf("%s\n",(char*)str);
    return 0;
}
  • 偏移量建议给0;
  • 当选择MAP_SHARED的时候,open文件选择O_RDONLY|PROT_WRITE,但是映射的进程内存只支持读;
  • 如果文件描述符先关闭,再mmap映射,会报段错误;
  • 如果文件描述符==-1,再mmap映射,磁盘映射只支持有公共祖先进程通信(匿名映射);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞翔的杨先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值