mmap共享内存

mmap创建了共享内存,使用两个进程同时访问的时候,需要注意同步问题,需要用互斥量保护内存。

#include <iostream>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>

#define PAGE_SIZE 4096
using namespace std;
int main() {
//    创建共享内存
   int fd;
   void* p;
   
   fd=open("/dev/zero",O_RDWR);
   if(fd<0){
       cout<<"open failed\n";
       perror("open failed");
       return 0;
   }

   p=(int *)mmap(NULL, 4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
   close(fd);

   if(p==MAP_FAILED){
       cout<<"map failed\n";
       perror("mmap failed");
       return 0;
   }

   *(int*)p=0;
   if(fork()==0){
       for(int i=0;i<10000;++i){
           (*(int*)p)++;
       }
   }else{
       for(int i=0;i<10000;++i) {
           (*(int*)p)++;
       }
       int stat;
       wait(&stat);
       cout<<(*(int*)p)<<endl;
       munmap(p,sizeof(int));
   }

   std::cout << "Hello, World!" << std::endl;
   return 0;
}

下面是多次执行的结果,最终的变量不确定。

**:mmap$ ./a.out 
Hello, World!
20000
Hello, World!
**:mmap$ ./a.out 
Hello, World!
15708
Hello, World!
**:mmap$ ./a.out 
Hello, World!
16036
Hello, World!
**:mmap$ ./a.out 
Hello, World!
16231
Hello, World!
**:mmap$ ./a.out 
Hello, World!
19134
Hello, World!
**:mmap$ ./a.out 
Hello, World!
10000
Hello, World!
**:mmap$ ./a.out 
Hello, World!
16382
Hello, World!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值