简单的Posix共享内存区程序


简单的Posix共享内存区程序

参照《unix 网络编程 卷2》的例子

多个进程同时计数。

环境为centos 6.5  gcc 4.8   glibc  2.12

func.h

#ifndef M_FUNC_H_

#define M_FUNC_H_

/**

*this is some func header

*create by coderguagn

*date 2015/0304

*

* */

#include <sstream>

#include <iostream>

#include <ctime>

using namespace std;

//int to string

static string IntToStr(int value){

stringstream ss;

ss<<value;

return ss.str();

}

static int StrToInt(string value){

int number;

stringstream ss;

ss<<value; //string –>stringstream

ss>>number; //stringstream–>int

return number;

}

//get the time now

static string GetTimeNow(){

char *s;

time_t now;

time(&now);

s=ctime(&now);

string t=s;

return t;

}

//delay

void delay(double sec){

time_t start_time,cur_time;

time(&start_time);

do{

time(&cur_time);

}while(cur_time-start_time<sec);

}

#endif

服务器代码:

#include <iostream>

#include <stdlib.h>

#include <sys/mman.h>

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <errno.h>

#include <unistd.h>

#include <fcntl.h>

#include <semaphore.h>

using namespace std;

struct shmstruct{

int count;

};

sem_t *m_mutex;

int main(int argc,char **argv){

int fd;

struct shmstruct *ptr;

shm_unlink(“mmregion”);

fd=shm_open(“mmregion”,O_RDWR|O_CREAT|O_EXCL,0644);

if(fd<0)

printf(“create shm fail\n”);

ftruncate(fd,sizeof(shmstruct));

ptr=(shmstruct*)mmap(NULL,sizeof(shmstruct),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

close(fd);

int s=sem_unlink(“shmsemm”);

m_mutex=sem_open(“shmsemm”,O_CREAT|O_EXCL,0644,1);

sem_close(m_mutex);

exit(0);

}

 

客户端代码:

#include <stdlib.h>

#include <stdio.h>

#include <unistd.h>

#include <semaphore.h>//for sem_t

#include <sys/mman.h>

#include <fcntl.h> //for O_RDWR,FILE_MODE

#include <errno.h>

#include <sys/types.h>

#include <sys/stat.h>

#include “Func.h”

struct shmstruct{

int count;

};

sem_t *m_mutex;

int main(int argc,char **argv){

int fd,i,nloop;

pid_t pid;

struct shmstruct *ptr;

nloop=1000;

fd=shm_open(“mmregion”,O_RDWR,0644);

if(fd<0){

printf(“something error when open the region\n”);

}

//int len=sizeof(shmstruct);

ptr=(shmstruct*)mmap(NULL,sizeof(shmstruct),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

//ptr=mmap(NULL,sizeof(shmstruct),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

close(fd);

m_mutex=sem_open(“shmsemm”,O_RDWR,0644,0);

pid=getpid();

for(i=0;i<nloop;i++){

sem_wait(m_mutex);

printf(“pid %ld:%d\n”,(long)pid,ptr->count++);

sem_post(m_mutex);

delay(1);

}

exit(0);

}

 

注意:编译的时候需要  -lrt   -lpthread 编译参数

先运行服务器程序,然后可以打开多个客户端代码进行测试。

文章作者:coderguang      email:  royalchen@royalchen.com

博客链接:http://blog.royalchen.com

备注:自2015-03-25之后,如无特殊说明,文章均为coderguang原创,转载请注明出处,文章由coderguang保留所有权利。

日期:2015-04-08

 


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注