Linux下C編程:記憶體映像那些事兒

來源:互聯網
上載者:User

記憶體映像其實就是在記憶體中建立一個和外存檔案完全相同的映像。使用者可以將整個檔案對應到記憶體中也可以部分映射到記憶體。系統會將對記憶體映像的改動如實的反映到外存檔案中。從而實現了通過記憶體映像對外存檔案的操作。

記憶體映像的特點:

1、可以加快對IO的操作速度。

2、使用者可以通過指標對檔案進行操作,間接~~~

3、實現了檔案資料的共用,將外存檔案對應到共用記憶體中,很方便的實現了資料共用,並能完成把資料儲存到外存的工作。

註:記憶體映像只能對內部可以定位的檔案進行操作,如普通檔案。不能對管道,通訊端檔案進行操作。

建立記憶體映射:

#include<sys/types.h>              #include<sys/mman.h>              void *mmap(void *start,size_t length,intport,int flag,int fd,off_t offset)

start為指標通常設為NULL,表示映射記憶體有系統決定。因為指定記憶體會經常出錯。

length為記憶體映像佔用的記憶體空間大小。以位元組為單位。

port表示記憶體映像的安全性。

PROT_EXEC表示被映像記憶體可能有機器碼,可執行。

PORT_NONE表示被映像記憶體不能被訪問。

PORT_READ表示被映像記憶體可讀

PORT_WRITE表示被映像記憶體可寫

flag記憶體映像標誌:

MAP_FIXED表示如果無法從start地址建立記憶體映像,則出錯返回。

MAP_PRIVATE表示對記憶體映像進行的改動不反映到外存檔案中。

MAP_SHARED表示對記憶體映像進行的改動反映到外存檔案中。

fd檔案描述符

offset表示所映像的內容距檔案頭的距離。

撤銷記憶體映射:

#include<sys/types.h>              #include<sys/mman.h>              int munmap(void *start,size_t length);

改變記憶體屬性:

修改保護值:

int protect(const void *addr,size_tlength,int prot);

addr表示地址和上面相同。

length記憶體映像大小同上。

prot重新設定的保護值。

成功返回0失敗返回-1

修改記憶體鏡像大小:

void *mremap(void *old_addr,size_told_length,size_t new_length,unsigned long *flag)

flg用於設定是否在需要移動記憶體鏡像時移動該鏡像。如:MRMAP_MAYMOVE

調用成功返回新的起始地址,失敗返回-1

程式如下:

#include <stdio.h>     #include<sys/types.h>     #include<sys/stat.h>     #include<fcntl.h>     #include<unistd.h>     #include<sys/mman.h>              int main()     {         int fd;         char *start;         char buf[100];                      /*開啟檔案*/     fd = open("testfile",O_RDWR);                          start=mmap(NULL,lseek(fd,0,SEEK_END),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);                      /* 讀出資料 */     strcpy(buf,start);         printf("mmap = %s\n",buf);                      /* 寫入資料 */     strcpy(start,"Buf Is Not Null!");         printf("mmap:%s\",start);                      munmap(start,100); /*解除映射*/     close(fd);                        return 0;         }

查看全套文章:http://www.bianceng.cn/Programming/C/201212/34807.htm

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.