32查运行内存的map文件_Linux进程间通信——内存共享映射
生活随笔
收集整理的這篇文章主要介紹了
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进程间通信——内存共享映射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 矩阵sum_推荐系统——从协同过滤到矩阵
- 下一篇: linux内核多大 4.17.8,Lin