- 论坛徽章:
- 0
|
本帖最后由 kris_fei 于 2010-07-05 21:02 编辑
- //writemem.c
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <string.h>
- typedef struct{
- char name[4];
- int age;
- }people;
- main(int argc, char** argv) // map a normal file as shared mem:
- {
- int fd,i;
- people *p_map;
- char temp;
- fd=open("./tmpmem",O_CREAT|O_RDWR|O_TRUNC,00777);
- lseek(fd,sizeof(people)*5-1,SEEK_SET);
- write(fd,"",1);
- p_map = (people*) mmap( NULL,sizeof(people)*10,PROT_READ|
- PROT_WRITE,MAP_SHARED,fd,0 );
- //close( fd );
- temp = 'a';
- for(i=0; i<10; i++)
- {
- temp += 1;
- memcpy( ( *(p_map+i) ).name, &temp,2 );
- ( *(p_map+i) ).age = 20+i;
- }
- printf(" initialize over \n ");
- while(1)
- sleep(1);
- munmap( p_map, sizeof(people)*10 );
- printf( "umap ok \n" );
- }
- //readmem.c
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdio.h>
- typedef struct{
- char name[4];
- int age;
- }people;
- main(int argc, char** argv) // map a normal file as shared mem:
- {
- int fd,i;
- people *p_map;
- fd=open( "./tmpmem",O_CREAT|O_RDWR,00777 );
- p_map = (people*)mmap(NULL,sizeof(people)*10,PROT_READ|
- PROT_WRITE,MAP_SHARED,fd,0);
- while(1)
- {
- for(i = 0;i<10;i++)
- {
- printf( "name: %s age %d;\n",(*(p_map+i)).name, (*(p_map+i)).age );
- }
- sleep(1);
- }
- munmap( p_map,sizeof(people)*10 );
- }
复制代码 我映射10个结构体大小的内存,但是文件大小只有5个结构大小.
理论上说不超过一页是不会出错的.一开始我能读到数据,不过过了几十秒之后就后面5个结构体数据内容就都没了,就只有前5个数据,难道是内核自动刷新掉文件大小以外的内容了?
书上理论:
在 linux 中,内存的保护是以页为基本单位的,即使被映射文件只有一个字节大小,内核也会为映
射分配一个页面大小的内存。当被映射文件小于一个页面大小时,进程可以对从 mmap()返回地址开始的
一个页面大小进行访问,而不会出错;但是,如果对一个页面以外的地址空间进行访问,则导致错误发
生,后面将进一步描述。因此,可用于进程间通信的有效地址空间大小不会超过文件大小及一个页面大
小的和。 |
|