您的位置:首页 > 其它

进程通信-共享内存-mmap()-code1

2011-08-30 17:13 381 查看
参考了sjmw888的用例,在其基础上做了修改,用于三个进程共享内存, 但每个进程只对特定区段改写.

简单模拟,未使用信号、信号量等来控制。

/*-------------map_normalfile1.c-----------*/
/*来源:http://blog.csdn.net/sjmw888/article/details/5318667*/

#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>

typedef struct {
char name[20];
int  age;
}people;

int main(int argc, char** argv)
{
int fd,i;
people *p_map;
people *p_map_seg1;
people *p_map_seg2;
people *p_map_seg3;
char temp[20]={0};

fd=open("map_normalfile.in", O_CREAT|O_RDWR|O_TRUNC, 00777);
lseek(fd,  sizeof(people)*30-1, SEEK_SET);
write(fd, "", 1);
printf("%d\n", lseek(fd, 0, SEEK_CUR) );
lseek(fd,  0, SEEK_SET);
p_map = (people*)mmap( NULL,sizeof(people)*10*3,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0 );
p_map_seg1 = p_map;
p_map_seg2 = p_map+10;
p_map_seg3 = p_map+20;
close( fd );

printf("p_map=0x%x\n", p_map); //在各个进程中映射同一文件, mmap返回的内存映像地址相同

printf("========Write Seg1===================\n");
for(i=0; i<10; i++)
{
sprintf(temp, "peple_1%02d", i);
memcpy( ( *(p_map_seg1+i) ).name, temp, strlen(temp)+1);
( *(p_map_seg1+i) ).age = 10+i;
printf( "name:%s age:%d;\n",(*(p_map_seg1+i)).name, (*(p_map_seg1+i)).age );
sleep(1);
}
printf(" initialize seg1 over \n ");
sleep(10);

printf("=========All Data==================\n");
for(i = 0;i<30;i++)
{
printf( "name=%s age=%d;\n",(*(p_map+i)).name, (*(p_map+i)).age );
}

sleep(30);
munmap( p_map, sizeof(people)*10*3 );
printf( "umap ok \n" );
return 0;
}
后续:

进程通信-共享内存-mmap()-code2

进程通信-共享内存-mmap()-code3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: