星期四, 4月 14, 2005

mmap : mmap a file

void *mmap(void *start,size_t length,int prot,int flags,int fd, off_t offset);
start : 要把記憶體放哪?如果是0代表請system決定。
length : 要把fd的多少大小(長度)映射到記憶體。
prot : 保護方式

PROT_EXEC : 可被執行
PROT_READ : 可被讀取
PROT_WRITE : 可被寫入
PROT_NONE : 不能存取

flag : 特性

MAP_FIXED : 如果start指定的位置無法被映射則放棄
MAP_SHARED : 寫入資料到映射區會寫回fd內,供其他process使用。
MAP_PRIVATE : 對fd作複製,所有動作不影響到fd.
MAP_ANONYMOUS : 忽略fd,和檔案無關。
MAP_DENYWRITE : 只允許經由映射區作寫入,不允許其他process對fd寫入
MAP_LOCKED : 鎖定映射區,不被swap out

offset : 從fd的offset位置開始映射,必須要是分頁大小的整數倍。

return code
成功則傳回映射的起始位址,否則傳回MAP_FAILED(-1),原因再errno中。


#include <sys/mman.h>
#include <stdio.h>
#include <fcntl.h>
int main(int argc,int *argv[])
{
int fd;
char *mapped_mem;
const int len=100;
int i;

fd = open("testfile",O_RDWR | O_CREATE);
lseek(fd,length+1,SEEK_SET);
write(fd,"\0",1);
lseek(fd,0 ,SEEK_SET);

mapped_mem=mmap(0,len,PROT_WRITE,MAP_SHARED,fd,0);
close(fd);

for(i=0;i<10;i++)
mapped_mem[i]='0'+i;

return 0;
}

執行後會產生testfile檔,cat後會是
1234567890

沒有留言:

網誌存檔