共有メモリマッピングmmapノート

9363 ワード

共有メモリマッピングmmapノート


文書ディレクトリ

  • 共有メモリマッピングmmapノート
  • マッピング領域の作成:mmap関数プロトタイプ
  • パラメータ
  • 戻り値
  • 解放マッピング領域:munmap関数プロトタイプ
  • パラメータ
  • サンプルコード
  • 注意事項
  • mmap匿名マッピング領域
  • マッピング領域の作成:mmap関数のプロトタイプ

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

    パラメータ

  • addr:マッピング領域のヘッダアドレスを指定し、通常NULL
  • を通過する
  • length:共有メモリマッピング領域サイズ
  • prot:共有メモリマッピング領域の読み書き属性、PROT_READ,PROT_WRITE,PROT_READ|PROT_WRITE
  • flags:共有メモリをマークする(プロセス間)共有プロパティ、MAP_SHARED,MAP_PRIVATE
  • fd:共有メモリマッピング領域のファイルを作成するためのファイル記述子
  • offset:オフセット量、4 kの整数倍
  • でなければならない

    戻り値

  • 成功:マッピング領域ヘッダアドレス
  • 失敗:MAP_FAILED,errno

  • 解放マッピング領域:munmap関数プロトタイプ

    int munmap(void *addr, size_t length);
    

    パラメータ

  • addr:mmapの戻り値
  • length:マッピング領域サイズ
  • サンプルコード

    #include 
    #include 
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    void sys_err(const std::string& str) {
        perror(str.c_str());
        exit(1);
    }
    
    int main(void)
    {
        // 
        char* p = nullptr;
        // 
        int fd;
        fd = open("testmap.tmp", O_RDWR | O_CREAT | O_TRUNC, 0644);
        if (fd == -1) {
            sys_err("open error");
        }
        // 
        ftruncate(fd, 100);
        int len = lseek(fd, 0, SEEK_END);
        // 
        p = (char*)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);//C++ 
        if (p == MAP_FAILED) {
            sys_err("mmap error");
        }
        // 
        close(fd);
        // p 
        strcpy(p, "========HELLO========");
        // p
        printf("%s", p);
    
        // 
        int ret = munmap(p, len);
        if(ret == -1){
             sys_err("munmap error");
        }
        return 0;
    }
    

    注意事項

  • マッピング領域を作成するためのファイルサイズは0で、実際には0以外のサイズを指定してマッピング領域を作成し、バスエラー
  • .
  • マッピング領域の作成に使用するファイルサイズは0であり、実際には0サイズを指定してマッピング領域を作成し、無効なパラメータ
  • マッピング領域を作成するためのファイル属性読み取り専用、マッピング領域属性読み書き、無効なパラメータ
  • マッピング領域の作成にはread権限が必要です.mmapの読み書き権限は<=ファイルのopen権限で、mmapは書くだけではだめです.
  • マッピング領域を作成すると、ファイル記述子
  • を閉じることができる.
  • offsetは4096の整数倍(4 k)
  • でなければならない.
  • マッピング領域アクセス権限をMAP_に設定PRIVATE、メモリ操作はディスクに反映されない
  • マッピング領域アクセス権限をMAP_に設定PRIVATE、Openファイルのみ必要な場合は、マッピング領域を作成するための読み書き権限があります
  • mmap匿名マッピング領域


    ディスク上でファイルを操作しない

    #include 
    #include 
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    void sys_err(const std::string& str) {
        perror(str.c_str());
        exit(1);
    }
    
    int main(void)
    {
        // 
        char* p = nullptr;
        // 
        int len = 100;
        // MAP_ANON 
        p = (char*)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); //C++ 
        if (p == MAP_FAILED) {
            sys_err("mmap error");
        }
        // 
        strcpy(p, "99999");
        // p
        printf("%s", p);
    
        // 
        int ret = munmap(p, len);
        if (ret == -1) {
            sys_err("munmap error");
        }
        return 0;
    }