mmap、munmap函數

#include <sys/mman.h>

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

int munmap(void *addr, size_t length);

?

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

返回:成功,返回創建的映射區首地址(其返回的地址可以作為數組的首地址來使用);失敗,返回MAP_FAILED(宏)。

addr:建立映射區的首地址,由Linux內核指定。使用時,直接傳遞NULL

length:欲創建映射區的大小(必須小于文件大小);

prot:映射區權限PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE(兩個宏位或);

flags:標志位參數(常用于設定更新物理區域、設置共享、創建匿名映射區),MAP_SHARED:會將映射區所做的操作反映到物理設備(磁盤)上,MAP_PRIVATE:映射區所做的修改不會反映到物理設備;

fd:用來建立映射區的文件描述符

offset:映射文件的偏移4k的整數倍),即只是映射文件的部分,不是從開始處映射。

?

int munmap(void *addr, size_t length);

同malloc(new)函數申請內存空間類似的,mmap建立的映射區在使用結束后也應調用類似free(delete)的函數來釋放。

addr:映射區的首地址?? length:映射區的長度

成功:0,失敗:-1

?

兩個函數的注意事項:

1.創建映射區的過程中,隱含著一次對映射文件的讀操作,因此在打開文件時必須包括讀權限,才能創建映射區;

2.當MAP_SHARED時,要求:映射區的權限應 <=文件打開的權限(出于對文件的保護)。而MAP_PRIVATE則無所謂,因為mmap中的權限是對內存的限制;

3.映射區的釋放與文件關閉無關。只要映射建立成功,文件可以立即關閉。在建立好映射區之后就可以關閉文件了,以后在對映射區的讀寫操作不再需要文件描述符了,因為映射關系已經被mmap系統調用確定了。

4.特別注意,當映射文件大小為0時,不能創建映射區。所以:用于映射的文件必須要有實際大小!不能為0mmap使用時常常會出現總線錯誤,通常是由于共享文件存儲空間大小引起的。malloc(或new)分配的地址大小(堆空間)都可以指定為0(使用完后,需要free(或delete)釋放),但是mmap不可以!!

5.munmap傳入的地址一定是mmap的返回地址,堅決杜絕指針++操作(必須完全對應);

6.文件偏移量必須為4K的整數倍,因為MMU完成了從線性地址到物理地址的映射,映射時以頁為單位進行的,一頁一頁進行映射;

7.mmap創建映射區出錯概率非常高,一定要檢查返回值,確保映射區建立成功再進行后續操作。

因此,對于新創建的文件,必須對文件進行拓展(ftruncate、truncate和lseek),然后才能創建映射區。對于lseek、mmap等函數的指針移動都是以字節為單位的(char為1個字節)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385344.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385344.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mmap和munmap對文件進行操作(讀寫等)

//mmap、munmap函數的使用 #include <stdio.h> #include <string.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <sys/mman.h>void sys_err(char *str) {perror(str);exit(1); }…

1017. A除以B (20)

本題要求計算A/B&#xff0c;其中A是不超過1000位的正整數&#xff0c;B是1位正整數。你需要輸出商數Q和余數R&#xff0c;使得A B * Q R成立。 輸入格式&#xff1a; 輸入在1行中依次給出A和B&#xff0c;中間以1空格分隔。 輸出格式&#xff1a; 在1行中依次輸出Q和R&#…

mmap父子進程間通信

父子等有血緣關系的進程之間也可以通過mmap建立的映射區來完成數據通信。但相應的要在創建映射區的時候指定對應的標志位參數flags&#xff1a;MAP_PRIVATE&#xff1a;&#xff08;私有映射&#xff09;父子進程各自獨占映射區&#xff1b;MAP_SHARED&#xff1a;&#xff08;…

匿名映射

通過使用我們發現&#xff0c;使用映射區來完成文件讀寫操作十分方便&#xff0c;父子進程間通信也較容易。但缺陷是&#xff0c;每次創建映射區一定要依賴一個文件才能實現。通常為了建立映射區要open一個temp文件&#xff0c;創建好了再unlink、close掉&#xff0c;比較麻煩。…

mmap無血緣關系進程間通信

實質上mmap是內核借助文件幫我們創建了一個映射區&#xff0c;多個進程之間利用該映射區完成數據傳遞。由于內核空間多進程共享&#xff0c;因此無血緣關系的進程間也可以使用mmap來完成通信。只要設置相應的標志位參數flags即可。若想實現共享&#xff0c;當然應該使用MAP_SHA…

【C++ Primer | 13】課后習題答案

文章目錄13.1.4節目練習13.2節練習13.2.2練習13.1.4節目練習 練習13.14 #include <iostream> using namespace std;class numbered { private: static int seq; public:numbered() { mysn seq; }int mysn; };int numbered::seq 0;void f(numbered s) { cout <…

信號的概念與機制

信號的共性&#xff1a;1. 簡單&#xff08;開銷小&#xff0c;且在用或者不用的情況下&#xff0c;開銷是一樣的&#xff09;&#xff1b;2. 不能攜帶大量信息&#xff08;如程序執行過程中&#xff0c;出現段錯誤時&#xff0c; 就會發送一個相關的信號&#xff08;編號為11&…

信號的產生和狀態

信號的產生&#xff1a;1.按鍵產生&#xff0c;如&#xff1a;Ctrlc&#xff08;內核向進程發送信號&#xff0c;殺死該進程&#xff09;、Ctrlz、Ctrl\&#xff1b;2.系統調用產生&#xff0c;如&#xff1a;kill、raise、abort&#xff1b;3.軟件條件產生&#xff0c;如&…

【C++ Priemr | 15】虛函數常見問題

1. 在成員函數中調用虛函數&#xff1a; #include <iostream> using namespace std; class CBase { public:void func1(){func2();}virtual void func2() { cout << "CBase::func2()" << endl; } }; class CDerived : public CBase { public:virt…

965. 單值二叉樹

如果二叉樹每個節點都具有相同的值&#xff0c;那么該二叉樹就是單值二叉樹。 只有給定的樹是單值二叉樹時&#xff0c;才返回 true&#xff1b;否則返回 false。 示例 1&#xff1a; 輸入&#xff1a;[1,1,1,1,1,null,1] 輸出&#xff1a;true示例 2&#xff1a; 輸入&#…

信號四要素

與變量三要素&#xff08;類型、名字、值&#xff09;類似的&#xff0c;每個信號也有其必備4要素&#xff0c;分別是&#xff1a;1.編號&#xff1b;2.名稱&#xff08;即編號的宏定義&#xff09; &#xff1b;3.事件&#xff08;引起信號產生的事件&#xff0c;如段錯誤&…

958. 二叉樹的完全性檢驗

給定一個二叉樹&#xff0c;確定它是否是一個完全二叉樹。 百度百科中對完全二叉樹的定義如下&#xff1a; 若設二叉樹的深度為 h&#xff0c;除第 h 層外&#xff0c;其它各層 (1&#xff5e;h-1) 的結點數都達到最大個數&#xff0c;第 h 層所有的結點都連續集中在最左邊&a…

信號的產生

&#xff08;1&#xff09;終端按鍵產生信號&#xff08;與終端交互的進程&#xff09; Ctrl c → 2) SIGINT&#xff08;終止/中斷&#xff09; "INT" ----Interrupt Ctrl z → 20) SIGTSTP&#xff08;暫停/停止&#xff09; "T" ----Termin…

897. 遞增順序查找樹

給定一個樹&#xff0c;按中序遍歷重新排列樹&#xff0c;使樹中最左邊的結點現在是樹的根&#xff0c;并且每個結點沒有左子結點&#xff0c;只有一個右子結點。 示例 &#xff1a; 輸入&#xff1a;[5,3,6,2,4,null,8,1,null,null,null,7,9]5/ \3 6/ \ \2 4 8/ …

信號集操作函數

內核通過讀取未決信號集來判斷信號是否應被處理。信號屏蔽字mask可以影響未決信號集。而我們可以在應用程序中自定義set來改變mask。已達到屏蔽指定信號的目的。綜上&#xff1a;自定義信號集set&#xff08;也為一個字&#xff0c;64位&#xff09;通過信號集操作函數來改變信…

信號捕捉(signal、sigaction)

信號的基本屬性&#xff1a;軟中斷&#xff0c;由內核發送&#xff0c;內核處理。某個進程通過內核向另一個進程發送信號時&#xff08;引起信號產生的五個因素&#xff09;&#xff0c;另一個進程將會陷入內核進行中斷處理&#xff0c;未決信號集中相應信號置1&#xff0c;當遞…

1090 Highest Price in Supply Chain (25)(25 分)

A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;經銷商&#xff09;, and suppliers&#xff08;供應商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting from one root suppli…

時序競態(競態條件)

產生原因&#xff1a;仍然以前文實現的sleep函數為例&#xff0c;如果進程在執行完alarm函數后&#xff0c;突然失去CPU&#xff0c;被阻塞等待&#xff08;這是有可能的&#xff0c;進程在執行過程中&#xff0c;若非原子操作&#xff0c;都有可能隨時失去CPU&#xff09;&…

1106 Lowest Price in Supply Chain (25)

A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;經銷商&#xff09;, and suppliers&#xff08;供應商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting from one root suppli…

【Leetcode | 順序刷題 】二分查找目錄

二分查找序號題號129. 兩數相除 50. Pow(x, n) 69. x 的平方根