• 内存控制函数(1)-mmap() 建立内存映射


    示例1:

    1.首先建立一个文本文件,名字为tmp,内容为hello world

    2.编写mmap.c

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/mman.h>
    
    int main()
    {
            int fd, len;
            int *p; 
            fd = open("tmp", O_RDWR);
            if (fd < 0) {
                    perror("open");
                    exit(1);
            }
        
            len = lseek(fd, 0, SEEK_END);
            // 第一个参数代表内存起始地址,设为NULL代表让系统自动选定地址
            p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
            if (p == MAP_FAILED) {
                    perror("mmap");
                    exit(1);
            }
            // 如果映射成功,修改p[0]
            p[0] = 0x30313233;
            close(fd);
            // 释放内存映射地址
            munmap(p, len);
            return 0;
    }

    3.运行,并查看tmp内容

    od -tx1 -tc tmp

    0000000 33 32 31 30 6f 20 77 6f 72 6c 64 0a
    3 2 1 0 o w o r l d
    0000014

    磁盘文件tmp的内容已被修改.

    示例2:利用mmap实现进程间通信

    process_mmap_w.c

    /* process_mmap_w.c */
    #include <stdlib.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/mman.h>
    
    #define MAPLEN 0X1000
    
    struct STU {
        int id;
        char name[20];
        char sex;
    };
    
    void sys_error(char *str, int exitno)
    {
        perror(str);
        exit(exitno);
    }
    
    
    int main(int argc, char *argv[])
    {
        
        struct STU *mm;
        int fd, i = 0;
        if(argc < 2) {
            printf("Need filename! 
    ");
            exit(1);
        }
             fd = open(argv[1], O_RDWR | O_CREAT, 0777);        
        if (fd < 0)
            sys_error("open", 1);
            
        if (lseek(fd, MAPLEN-1, SEEK_SET) < 0)
            sys_error("lseek", 3);
        
        if (write(fd, "", 1) < 0)
            sys_error("write", 4);
        
        mm = mmap(NULL, MAPLEN, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
        if (mm == MAP_FAILED)
            sys_error("mmap", 2);
    
        close(fd);
        
        while(1) {
            mm->id = i;
            sprintf(mm->name, "zhang-%d", i);
            if (i%2 == 0)
                mm->sex = 'm';
            else
                mm->sex = 'w';
            i++;
            sleep(1);            
        }
        munmap(mm, MAPLEN);
        return 0;
    }

    process_mmap_r.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/mman.h>
    
    #define MAPLEN 0x1000
    
    struct STU {
        int id;
        char name[20];
        char sex;
    };
    
    void sys_err(char *str, int exitno)
    {
        perror(str);
        exit(exitno);
    }
    
    int main(int argc, char *argv[])
    {
        int fd;    
        struct STU *mm;    
    
        if (argc < 2) {
            printf("Need input filename
    ");
            exit(1);
        }
    
        fd = open(argv[1], O_RDWR);
        if (fd < 0)
            sys_err("open", 1);
        
        mm = mmap(NULL, MAPLEN, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
        if (mm == MAP_FAILED)
            sys_err("mmap", 2);
        
        close(fd);
        
        unlink(argv[1]);
        
        while(1) {
            printf("%d
    ", mm->id);
            printf("%s
    ", mm->name);
            printf("%c
    ", mm->sex);
            sleep(1);
        }
        munmap(mm, MAPLEN);
        return 0;
    }

    运行两个进程:

    10
    zhang-10
    m
    11
    zhang-11
    w
    12
    zhang-12
    m
    13
    zhang-13
    w
    14
    zhang-14
    m

  • 相关阅读:
    Linux命令备忘录
    Redis集群部署
    Java BIO、NIO、AIO 学习
    elasticsearch性能因素总结
    tomcat配置文件server.xml详解
    Tomcat性能优化及JVM内存工作原理
    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
    HttpClient使用学习
    Java的三种代理模式
    yzoi1109&&viojs1042最小步数的一点看法——回文数
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/8060260.html
Copyright © 2020-2023  润新知