分类: LINUX
2008-12-17 11:21:23
void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset )
参数fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定flags参数中的MAP_ANON,表明进行的是匿名映射(不涉及具体的文件名,避免了文件的创建及打开,很显然只能用于具有亲缘关系的进程间通信)。len是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起。prot 参数指定共享内存的访问权限。可取如下几个值的或:PROT_READ(可读) , PROT_WRITE (可写), PROT_EXEC (可执行), PROT_NONE(不可访问)。flags由以下几个常值指定:MAP_SHARED , MAP_PRIVATE , MAP_FIXED,其中,MAP_SHARED , MAP_PRIVATE必选其一,而MAP_FIXED则不推荐使用。offset参数一般设为0,表示从文件头开始映射。参数addr指定文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成。函数的返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址为该值的有效地址。
例子:
#include
#include
#include
#include
#include
#define SIZE 800*600*2
int main(int argc, char** argv){
int fd;
unsigned char a;
long j;
unsigned char *pMem;
unsigned char *pTemp;
fd = open("/dev/fb0",O_RDWR);
if(fd<0){
printf("open error%d\n",fd);
return -1;
}
pMem = (unsigned char*) mmap(NULL, SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(pMem<0){
printf("mmap error\n");
return -1;
}
for(a = 0x00; a < 0xff; a++){
pTemp = pMem;
for(j = 0; j< SIZE; j++){
*pTemp = a;
pTemp++;
}
usleep(500000);
}
pTemp = NULL;
pMem = NULL;
munmap(pMem,SIZE);
close(fd);
return 0;
}