Linux-mmap函數介紹

來源:互聯網
上載者:User
        mmap函數是unix/linux下的系統調用,來看《Unix Netword programming》卷二12.2節對mmap的介紹:
The mmap function maps either a file or a Posix shared memory object into the address space of a process.We use this function for three purposes:
1. with a regular file to provide memory-mapped I/O
2. with special files to provide anonymous memory mappings
3. with shm_open to provide Posix shared memory between unrelated processes

         mmap系統調用並不是完全為了用於共用記憶體而設計的。它本身提供了不同於一般對普通檔案的訪問方式,進程可以像讀寫記憶體一樣對普通檔案的操作。而Posix或系統V的共用記憶體IPC則純粹用於共用目的,當然mmap()實現共用記憶體也是其主要應用之一。
         mmap系統調用使得進程之間通過映射同一個普通檔案實現共用記憶體。普通檔案被映射到進程地址空間後,進程可以像訪問普通記憶體一樣對檔案進行訪問,不必再調用read(),write()等操作。

         我們的程式中大量運用了mmap,用到的正是mmap的這種“像訪問普通記憶體一樣對檔案進行訪問”的功能。實踐證明,當要對一個檔案頻繁的進行訪問,並且指標來回移動時,調用mmap比用常規的方法快很多。
         來看看mmap的定義:
void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

         參數fd為即將映射到進程空間的檔案描述字,一般由open()返回,同時,fd可以指定為-1,此時須指定flags參數中的MAP_ANON,表明進行的是匿名映射(不涉及具體的檔案名稱,避免了檔案的建立及開啟,很顯然只能用於具有親緣關係的處理序間通訊)。

         len是映射到調用進程地址空間的位元組數,它從被對應檔開頭offset個位元組開始算起。

         prot參數指定共用記憶體的存取權限。可取如下幾個值的或:PROT_READ(可讀),PROT_WRITE(可寫),PROT_EXEC(可執行),PROT_NONE(不可訪問)。

         flags由以下幾個常值指定:MAP_SHARED, MAP_PRIVATE, MAP_FIXED。其中,MAP_SHARED,MAP_PRIVATE必選其一,而MAP_FIXED則不推薦使用。
         如果指定為MAP_SHARED,則對映射的記憶體所做的修改同樣影響到檔案。如果是MAP_PRIVATE,則對映射的記憶體所做的修改僅對該進程可見,對檔案沒有影響。

         offset參數一般設為0,表示從檔案頭開始映射。

         參數addr指定檔案應被映射到進程空間的起始地址,一般被指定一個null 指標,此時選擇起始地址的任務留給核心來完成。函數的傳回值為最後檔案對應到進程空間的地址,進程可直接操作起始地址為該值的有效地址。

         看看下面這個圖(來自《Unix Netword programming》卷二12.2節),對mmap進一步加深印象:

         這裡不再詳細介紹mmap的參數,讀者可參考mmap手冊頁或者《Unix Netword programming》卷二12.2節獲得進一步的資訊。         最後,舉個例子來結束本節。4.2節說過,Fileinformation數組是以二進位的形式寫進一個叫inforindex的檔案中。那麼,當要訪問Fileinformation數組時,代碼類似這樣:
struct stat st;
char buffer=” inforindex”;
Fileinformation *_fileinfoIndexptr = NULL;
if(stat(buffer,&st)<0)
{
       fprintf(stderr,"error to stat %s/n",buffer);
       exit(-1);
}// mmap the inforindex to _fileinfoIndexptr
int fd=open(buffer, O_RDONLY);
if(fd<0)
{
       printf("error to open %s/n",buffer);
       exit(-1);
}
_fileinfoIndexptr   = (Fileinformation*)mmap(NULL,st.st_size, PROT_READ,MAP_SHARED,fd,0);
if(MAP_FAILED == _fileinfoIndexptr)
{
       printf("error to mmap %s/n",buffer);
close(fd);
       exit(-1);
}
close(fd);

 

原文地址:http://hi.baidu.com/weichao_zju/blog/item/53224ed96a99442d10df9b5b.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.