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

参考了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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值