APUE编程:137——进程间通信(mmap、munmap函数)

一、函数原型

#include <sys/mman.h>

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

int munmap(void *addr, size_t length);

 二、mmap函数

  • 函数功能

    •  用于申请一段内存空间。我们可以将这段内存作为进程间通信的共享内存,也可以将文件直接映射到其中
  • 返回值

    • 成功:返回目标内存区域的指针
    • 失败MAP_FAILED((void*)-1)
  • 参数说明

    • addr允许用户使用某个特定的地址作为这段内存的起始地址(如果设置为NULL,则系统自动分配一块地址)
    • length:指定内存段的长度
    • port:用来设置内存段的访问权限,它可以取一下几个值的按位或
      • PROT_READ:内存段可读
      • PROT_WRITE:内存段可写
      • PROT_EXEC:内存段可执行
      • PROT_NONE:内存段不能被访问
    • flags控制内存段内容被修改后程序的行为,它可以被设置为下表的某些值的按位或(只列出了部分,其中MAP_SHAREDMAP_PRIVATE不能同时指定)
      • 常用值含义
        MAP_SHARED在进程间共享这段内存,对该内存段的修改将反映到被映射的文件中。它提供了进程间共享内存的POSIX方法
        MAP_PRIVATE内存段为调用进程所私有。对该内存段的修改不会反映到被映射的文件中
        MAP_ANONYMOUS匿名映射。这段内存不是从文件映射而来的。其内容被初始化为全0。这种情况下,mmap函数的最后两个参数将被忽略。可以当malloc()函数使用。
        MAP_FIXED内存段必须位于addr参数指定的地址处。start必须是内存页面大小(4096字节)的整数倍
        MAP_HUGETLB

        按照“大内存页面”来分配内存空间。“大内存页面”的大小可通过/proc/meminfo文件来查看

    • fd是被映射文件对应的文件描述符。可以通过open调用获得
    • offset设置从文件的何处开始映射

三、munmap函数

  • 函数功能

    • 释放由mmap创建的这段内存空间
  • 返回值:

    • 成功:0
    • 失败:-1并设置errno
  • 伪码

    • munmap(addr, size);

四、代码实现 

  • mmap()当malloc()实现

struct student_st 
{
    char name[1024];
    int  math;
    int  chinese;  
};

/*****************************************************************************/

//1、mmap操作方式:
struct student_st *me_mmap;
me_mmap = mmap(NULL, sizeof(struct student_st),PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (me_mmap == MAP_FAILED)
{
    perror("mmap()");
    exit(1);
}

/*****************************************************************************/

//2、malloc操作方式:
stuct student_st *me_malloc
me_malloc = malloc(sizeof(*me_malloc));
if (me_malloc == NULL)
{
    perror("malloc()");
    exit(1);
}


参考:https://dongshao.blog.csdn.net/article/details/102893347 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值