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!