mmap函數(shù)實現(xiàn)把一個文件映射到一個內(nèi)存區(qū)域,從而我們可以像讀寫內(nèi)存一樣讀寫文件,他比單純調(diào)用read/write也要快上許多。在某些時候我們可以把內(nèi)存的內(nèi)容拷貝到一個文件中實現(xiàn)內(nèi)存?zhèn)浞荩?dāng)然,也可以把文件的內(nèi)容映射到內(nèi)存來恢復(fù)某些服務(wù)。另外,mmap實現(xiàn)共享內(nèi)存也是其主要應(yīng)用之一,mmap系統(tǒng)調(diào)用使得進(jìn)程之間通過映射同一個普通文件實現(xiàn)共享內(nèi)存。
關(guān)于mmap的內(nèi)容請看《Unix環(huán)境高級編程》12章。在這里,說一下使用mmap函數(shù)時可能遇到的問題:
//下面的代碼把文件1.ls中的內(nèi)容通過mmap函數(shù)寫入2.ls中,忽略出錯處理
int fd=open("1.ls",O_RDONLY);
int fd2=open("2.ls",O_CREAT|O_RDWR|O_TRUNC,S_IRUSR|S_IWUSR);//必須設(shè)置讀寫權(quán)限,若只有寫權(quán)限,會產(chǎn)生SIGSEGV信號
//mmap進(jìn)行文件映射時必須先讀取文件`
struct stat st;
fstat(fd,&st);
lseek(fd2,st.st_size-1,SEEK_SET);
write(fd2,"",1); //必須的,如果不設(shè)置,當(dāng)寫入數(shù)據(jù)的時候會遇到文件結(jié)束符,產(chǎn)生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); //關(guān)閉文件后 依然可修改文件內(nèi)容
close(fd2);
memcpy(_des,_src,st.st_size);
總結(jié)一下,可能產(chǎn)生的問題如下:
1.進(jìn)行文件映射的描述符必須擁有讀權(quán)限,否則會產(chǎn)生SIGSEGV信號
2.把內(nèi)存內(nèi)容寫入映射文件時,必須確保被寫文件當(dāng)前位置到文件結(jié)尾的長度不小于所寫內(nèi)容長度,否則產(chǎn)生SIGBUS信號
3.關(guān)閉文件描述符并不能保證文件內(nèi)容不被修改
4.munmap并不能使映射的內(nèi)容寫回磁盤