日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

32查运行内存的map文件_Linux进程间通信——内存共享映射

發布時間:2025/3/12 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 32查运行内存的map文件_Linux进程间通信——内存共享映射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概念

什么是內存共享映射?

  • 將磁盤文件的一部分直接映射到內存中
  • 共享內存,就是兩個或多個進程都可以訪問的同一塊內存空間,一個進程對這塊空間內容的修改可為其他參與通信的進程所看到的

映射種類

  • 共享映射(share),內存中數據修改時,磁盤對應也同時修改
  • 私有映射(private),內存中數據修改時,磁盤不修改

內存共享特點

  • 實現進程間通信最簡單也是最直接的方法就是共享內存——為參與通信的多個進程在內存中開辟一個共享區。由于進程可以直接對共享內存進行讀寫操作,因此這種通信方式效率特別高,但其弱點是,它沒有互斥機制,需要信號量之類的手段來配合。

二、相關函數

mmap

  • 功能:mmap可以把磁盤文件的一部分直接映射到內存,這樣文件中的位置直接就有對應的內存地址,對文件的讀寫可以直接用指針來做而不需要read/write函數

  • 頭文件:
    include<sys/mman.h>
  • 函數原型:
    void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
  • 參數:參數1:內存的地址的哪個位置
    傳NULL,操作系統會自動找一塊內存空間,若不為空,則給內核一個提示,應該從什么地址開始映射,內核會選擇addr之上的某個合適的地址開始映射,真正的映射首地址通過返回值可以得到參數2:申請的內存長度參數3:頁面屬性(權限),一頁(4096字節)PROT_EXEC 表示映射的這一段可執行PROT_READ 表示映射的這一段可讀PROT_WRITE 表示映射的這一段可寫PROT_NONE 表示映射的這一段不可訪問參數4:狀態標志
    (flag參數有很多種取值,這里只講兩種,其它取值可查看mmap(2))MAP_SHARED多個進程對同一個文件的映射是共享的,一個進程對映射的內存做了修改,另一個進程也會看到這種變化。MAP_PRIVATE多個進程對同一個文件的映射不是共享的,一個進程對映射的內存做了修改,另一個進程并不會看到這種變化,也不會真的寫到文件中去。參數5:fd該文件的描述符參數6:offset偏移量,從什么位置開始偏移
    按頁偏移,必須是頁大小的整數倍,在32位體系統結構上通常是4K(4096字節)的整數倍
  • 返回值:如果mmap成功則返回映射首地址,如果出錯則返回常數MAP_FAILED

Linuxc/c++服務器開發高階視頻學習資料+主頁qun獲取

munmap

  • 功能:解除映射
  • 頭文件:
    include<sys/mman.h>
  • 函數原型:
    int munmap(void *addr, size_t length);
  • 參數:參數1:接觸映射的地址參數2:接觸映射空間的長度
  • 返回值: 成功返回0,出錯返回-1

注意

  • 當進程終止時,該進程的映射內存會自動解除,也可以調用munmap解除映射
  • 段錯誤(權限出錯),總線出錯(可寫入大小不足)
  • 文件在磁盤中是用ASCII碼形式存儲

舉個例子通過mmap將hello.txt文件中數據修改

#include <stdlib.h> #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h>int main(void) {int *p;int len;int fd = open("hello.txt", O_RDWR);//打開hello文件if (fd < 0){perror("open hello");exit(1);}len = lseek(fd, 0, SEEK_END);p = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, 0);if (p == MAP_FAILED){perror("mmap");exit(1);}p[0] = 0x30313233;//更改前4位數據為 3 2 1 0close(fd);munmap(p, 6);return 0; }

運行結果如下

總結

以上是生活随笔為你收集整理的32查运行内存的map文件_Linux进程间通信——内存共享映射的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。