您的位置:首页 > 其它

共享内存的使用

2014-05-13 09:37 465 查看
/*******************************************
*共享内存mmap使用
*Date : Tue Apr 8 14:53:43 CST 2014
********************************************/
#include <iostream>

extern "C"{
#include <error.h>
#include <errno.h>
#include <sys/types.h>
#include <fcntl.h>
#include <semaphore.h>
#include <sys/mman.h>
}

using namespace std;

#define SEM_FILE "sem_lock"

int main(int argc,char* argv[])
{
char ch;
extern int optind;
extern char* optarg;
string fileName;
while((ch = getopt(argc,argv,"f:")) != -1){
switch(ch){
case 'f':
fileName = optarg;
default:
break;
}
}
//打开信号量
int count = 0;
int nLoop = 10;
sem_t* mutex;
mutex = sem_open(SEM_FILE,O_CREAT,0666,1);
if(mutex == SEM_FAILED){
cerr << "failed to open sem,error:" << strerror(errno) << endl;
return -1;
}

int fd = open(fileName.c_str(),O_CREAT|O_RDWR,0666);
if(fd == -1){
cerr << "failed to open the file,error:" << strerror(errno) << endl;
sem_close(mutex);
return -1;
}
write(fd,&count,sizeof(int));//初始数据写入文件
//创建共享内存映射,共享内存可读、写,以共享方式创建
int* ptr = (int*)mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);//关闭文件描述符

if(fork() == 0){//child
for(int i = 0;i < nLoop;i++){
sem_wait(mutex);
printf("child:%d\n",(*ptr)++);
sem_post(mutex);
}
exit(0);
}

//parent
for(int i = 0;i < nLoop;i++){
sem_wait(mutex);
printf("parent:%d\n",(*ptr)++);
sem_post(mutex);
}
return 0;
}
/*========================================
*父子进程间共享内存,可以匿名内存映射
*,简化步骤,mmap创建的标志需要加上MAP_ANON
=========================================*/
/*******************************************
*共享内存mmap使用
*Date : Tue Apr 8 14:53:43 CST 2014
********************************************/
#include <iostream>
extern "C"{
#include <error.h>
#include <errno.h>
#include <sys/types.h>
#include <fcntl.h>
#include <semaphore.h>
#include <sys/mman.h>
}
using namespace std;

#define SEM_FILE "sem_lock"

int main(int argc,char* argv[])
{
//打开信号量
int nLoop = 10;
sem_t* mutex;
mutex = sem_open(SEM_FILE,O_CREAT,0666,1);
if(mutex == SEM_FAILED){
cerr << "failed to open sem,error:" << strerror(errno) << endl;
return -1;
}

//创建共享内存映射,共享内存可读、写,以共享方式创建
int* ptr = (int*)mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,-1,0);
if(ptr == NULL){
cerr << "failed to ceate mmap,error:" << strerror(errno) << endl;
return -1;
}
*ptr = 0;//初始值

if(fork() == 0){//child
for(int i = 0;i < nLoop;i++){
sem_wait(mutex);
printf("child:%d\n",(*ptr)++);
sem_post(mutex);
}
exit(0);
}

//parent
for(int i = 0;i < nLoop;i++){
sem_wait(mutex);
printf("parent:%d\n",(*ptr)++);
sem_post(mutex);
}
return 0;
}

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