程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Linux mmap函數簡介,linuxmmap函數

Linux mmap函數簡介,linuxmmap函數

編輯:關於C語言

Linux mmap函數簡介,linuxmmap函數


一、簡介

Linux提供了內存映射函數mmap, 它把文件內容映射到一段內存上(准確說是虛擬內存上), 通過對這段內存的讀取和修改, 實現對文件的讀取和修改, 先來看一下mmap的函數聲明:

  • 頭文件:
    • <unistd.h>
    • <sys/mman.h>
  • 原型: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offsize);
  • 返回值: 成功則返回映射區起始地址, 失敗則返回MAP_FAILED(-1).
  • 參數:
    • addr: 指定映射的起始地址, 通常設為NULL, 由系統指定.
    • length: 將文件的多大長度映射到內存.
    • prot: 映射區的保護方式, 可以是:
      • PROT_EXEC: 映射區可被執行.
      • PROT_READ: 映射區可被讀取.
      • PROT_WRITE: 映射區可被寫入.
      • PROT_NONE: 映射區不能存取.
    • flags: 映射區的特性, 可以是:
      • MAP_SHARED: 對映射區域的寫入數據會復制回文件, 且允許其他映射該文件的進程共享.
      • MAP_PRIVATE: 對映射區域的寫入操作會產生一個映射的復制(copy-on-write), 對此區域所做的修改不會寫回原文件.
      • 此外還有其他幾個flags不很常用, 具體查看linux C函數說明.
    • fd: 由open返回的文件描述符, 代表要映射的文件.
    • offset: 以文件開始處的偏移量, 必須是分頁大小的整數倍, 通常為0, 表示從文件頭開始映射.

下面說一下內存映射的步驟:

  • 用open系統調用打開文件, 並返回描述符fd.
  • 用mmap建立內存映射, 並返回映射首地址指針start.
  • 對映射(文件)進行各種操作, 顯示(printf), 修改(sprintf).
  • 用munmap(void *start, size_t lenght)關閉內存映射.
  • 用close系統調用關閉文件fd.

注意事項:

在修改映射的文件時, 只能在原長度上修改, 不能增加文件長度, 因為內存是已經分配好的.

 

二、示例

example1.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<error.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
    int fd,len;
    char *ptr;
    if(argc<2)
    {
        printf("please enter a file\n");
        return 0;
    }
    if((fd=open(argv[1],O_RDWR))<0)
    {
        perror("open file error");
        return -1;
    }
    len=lseek(fd,0,SEEK_END);
    ptr=mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//讀寫得和open函數的標志相一致,否則會報錯
    if(ptr==MAP_FAILED)
    {
        perror("mmap error");
        close(fd);
        return -1;
    }
    close(fd);//關閉文件也ok
    printf("length is %d\n",strlen(ptr));
    printf("the %s content is:\n%s\n",argv[1],ptr);
    ptr[0]='c';//修改其中的一個內容
    printf("the %s content is:\n%s\n",argv[1],ptr);
    munmap(ptr,len);//將改變的文件寫入內存
    return 0;
}

編譯

gcc -g -o example1 example1.c

運行

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved