c语言使用mmap函数写入内存-ag捕鱼王app官网

c语言使用mmap函数写入内存

作者:迹忆客 最近更新:2023/05/05 浏览次数:

在本文中,我们将学习 mmap() 函数,它需要多少个参数,以及如何在 c 编程中使用 mmap() 写入内存。


c 中的 mmap() 函数

我们使用这个函数来映射进程地址空间和设备或文件。 mmap() 函数请求内存 n 字节的可写匿名和私有映射。

匿名映射和私有映射意味着它不受文件支持,也不与其他进程共享。 要使用 mmap(),我们必须包含头文件。

#include 
it takes six arguments:
void * mmap (
    void *address,
    size_t length,
    int protect,
    int flags,
    int filedes,
    off_t offset
)

在开始使用这个函数之前,让我们讨论一下参数。

  1. address - 它提供用于映射的首选起始地址。 如果没有其他映射,内核将选择附近的页面边界,创建一个映射。

    否则,内核将选择新地址。 如果此参数的值为 null,则内核会将映射放置在它认为合适的位置。

  2. length - 映射的字节数。
  3. protect - 它控制允许什么类型的访问。 例如,用于读访问的 prot_read,用于写访问的 prot_write,以及用于执行的 prot_exec。
  4. flags - 用于控制地图的性质。 下面列出了一些常见和有用的标志:
    • map_shared - 与其他进程共享映射。
    • map_fixed - 系统被迫使用通过地址参数给出的相同映射地址。
    • map_anonymous / map_anon - 它创建匿名映射。
    • map_private - 映射将是私有的,并且在使用此标志时对其他人不可见。
  1. filedes - 应该映射文件描述符。
  2. offset - 文件映射从这个偏移量开始。

如果 mmap() 成功运行,我们会得到 0。 否则,返回 map_failed。


c语言使用mmap()写入内存

让我们通过练习不同的例子来理解 mmap()。

示例代码(用于内存分配):

#include 
#include 
int main(){
    int n=5;
    int *ptr = mmap ( null, n*sizeof(int),
                     prot_read | prot_write,
                     map_private | map_anonymous,
                     0, 0 );
    if(ptr == map_failed){
        printf("mapping failed\n");
        return 1;
    }
    for(int i=0; i10;
    for(int i=0; iprintf("[%d] ",ptr[i]);
    printf("\n");
    int err = munmap(ptr, 10*sizeof(int));
    if(err != 0){
        printf("unmapping failed\n");
        return 1;
    }
    return 0;
}

输出:

[0] [10] [20] [30] [40]

我们使用 mmap() 函数来分配内存,在分配时我们使用 prot_read | prot_write 保护来对映射区域进行读写操作。

我们使用 map_private 标志是因为我们不想与其他进程共享映射区域,而使用 map_anonymous 是因为我们还没有映射文件。

出于同样的原因,文件描述符和偏移量被设置为 0。

示例代码(用于进程间通信):

#include 
#include 
#include 
#include 
int main(){
    int number=5;
    int *ptr = mmap(null,number*sizeof(int),
                    prot_read | prot_write,
                    map_shared | map_anonymous,
                    0,0);
    if(ptr == map_failed){
        printf("mapping failed\n");
        return 1;
    }
    for(int i=0; i < number; i  ){
        ptr[i] = i   7;
    }
    printf("initial array's values:");
    for (int i = 0; i < number; i   ){
        printf(" %d", ptr[i] );
    }
    printf("\n");
    pid_t child_pid = fork();
    if ( child_pid == 0 ){
        //child
        for (int i = 0; i < number; i  ){
            ptr[i] = ptr[i] * 5;
        }
    }else{
        //parent
        waitpid ( child_pid, null, 0);
        printf("\nparent:\n");
        printf("updated array's values:");
        for (int i = 0; i < number; i   ){
           printf(" %d", ptr[i] );
        }
        printf("\n");
    }
    int err = munmap(ptr, number*sizeof(int));
    if(err != 0){
        printf("unmapping failed\n");
        return 1;
    }
    return 0;
}

输出:

initial array's values: 7 8 9 10 11
initial array's values: 7 8 9 10 11
parent:
updated array's values: 35 40 45 50 55

我们最初用一些值初始化数组。 然后,孩子的过程改变了价值观。

此外,值由父进程读取,子进程更改了这些值,因为映射内存正在与两个(子进程和父进程)共享。 我们还使用 munmap() 来删除内存映射。

上一篇:适用于 windows 的 c 编译器

下一篇:

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在c中将整数转换为字符

发布时间:2024/01/03 浏览次数:131 分类:c语言

本教程介绍了在c中将整数转换为字符的不同方法。在c编程语言中,将整数转换为字符在各种情况下都很重要。在c中,字符是以ascii值表示的,因此转换过程相对简单。

发布时间:2023/05/07 浏览次数:364 分类:c语言

本文介绍了如何在 c 语言中使用 typedef enum。使用 enum 在 c 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

c 语言中的静态变量

发布时间:2023/05/07 浏览次数:167 分类:c语言

本文介绍了如何在 c 语言中使用静态变量。在 c 语言中使用 static 变量在函数调用之间保存变量值

c 语言中生成随机数

发布时间:2023/05/07 浏览次数:158 分类:c语言

本文演示了如何在 c 语言中生成随机数。使用 rand 和 srand 函数在 c 语言中生成随机数

发布时间:2023/05/07 浏览次数:129 分类:c语言

本文演示了如何在 c 语言中使用前缀增量与后缀增量运算符。c 语言中 i 和 i 记号的主要区别

发布时间:2023/05/07 浏览次数:275 分类:c语言

本文演示了如何在 c 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

发布时间:2023/05/07 浏览次数:177 分类:c语言

本文介绍了如何在 c 语言中使用位掩码。使用 struct 关键字在 c 语言中定义位掩码数据

发布时间:2023/05/07 浏览次数:212 分类:c语言

本文演示了如何在 c 语言中使用标准库排序函数。使用 qsort 函数对 c 语言中的整数数组进行排序

c 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:131 分类:c语言

本文介绍了如何在 c 语言中使用 extern 关键字。c 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便
网站地图