mmap函數大文件讀寫可能出現的問題

轉載:http://www.chineselinuxuniversity.net/articles/41953.shtml

-------------------------------------------------------------------------

 mmap函數實現把一個文件映射到一個內存區域,從而我們可以像讀寫內存一樣讀寫文件,他比單純調用read/write也要快上許多。在某些時候我們可以把內存的內容拷貝到一個文件中實現內存備份,當然,也可以把文件的內容映射到內存來恢復某些服務。另外,mmap實現共享內存也是其主要應用之一,mmap系統調用使得進程之間通過映射同一個普通文件實現共享內存。

  關於mmap的內容請看《Unix環境高級編程》12章。在這裏,說一下使用mmap函數時可能遇到的問題:

  //下面的代碼把文件1.ls中的內容通過mmap函數寫入2.ls中,忽略出錯處理

  int fd=open("1.ls",O_RDONLY);

  int fd2=open("2.ls",O_CREAT|O_RDWR|O_TRUNC,S_IRUSR|S_IWUSR);//必須設置讀寫權限,若只有寫權限,會產生SIGSEGV信號

  //mmap進行文件映射時必須先讀取文件`

  struct stat st;

  fstat(fd,&st);

  lseek(fd2,st.st_size-1,SEEK_SET);

  write(fd2,"",1);        //必須的,如果不設置,當寫入數據的時候會遇到文件結束符,產生SIGBUS信號

  void *_src=mmap(NULL,st.st_size,PROT_READ,MAP_SHARED, fd,0);

  void *_des=mmap(NULL,st.st_size,PROT_WRITE,MAP_SHARED,fd2,0);

  close(fd);      //關閉文件後 依然可修改文件內容

  close(fd2);

  memcpy(_des,_src,st.st_size);

  總結一下,可能產生的問題如下:

  1.進行文件映射的描述符必須擁有讀權限,否則會產生SIGSEGV信號

  2.把內存內容寫入映射文件時,必須確保被寫文件當前位置到文件結尾的長度不小於所寫內容長度,否則產生SIGBUS信號

  3.關閉文件描述符並不能保證文件內容不被修改

  4.munmap並不能使映射的內容寫回磁盤


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章