/*
* Copyright (C) 2013 yangguo <yangguo@yangguo-ubuntu 12.4LTS>
* project name:commonModel
* created time:2013-07-07-09.45
* company:www.dbc.com
* support email:guoyang2011@gmail.com
* version:0.1
* main function:None
* modify information:None
*/
#include <sys/mman.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <pthread.h>
struct sharedmemory
{
pthread_mutex_t mutex;
pthread_cond_t isReadCond;
pthread_cond_t isWriteCond;
int condition;
char data[80];
};
#define SHAREDMEMORYFILE "data.d"
int main()
{
int fd;
int i=0;
int memorySize;
pthread_mutexattr_t mutexAttr;
pthread_condattr_t condAttr;
struct sharedmemory *ptr;
memorySize=sizeof(struct sharedmemory);
fd=shm_open(SHAREDMEMORYFILE,O_CREAT|O_TRUNC|O_RDWR,0777);
if(-1==fd)
{
printf("Shared shm_open\n");
exit(0);
}
if(ftruncate(fd,memorySize))
{
printf("Shared ftruncate\n");
exit(0);
}
ptr=mmap(NULL,memorySize,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(ptr==MAP_FAILED)
{
printf("Shared MAP_FAILED\n");
exit(0);
}
close(fd);
pthread_mutexattr_init(&mutexAttr);
pthread_mutexattr_setpshared(&mutexAttr,PTHREAD_PROCESS_SHARED);
pthread_condattr_init(&condAttr);
pthread_condattr_setpshared(&condAttr,PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&ptr->mutex,&mutexAttr);
pthread_cond_init(&ptr->isReadCond,&condAttr);
pthread_cond_init(&ptr->isWriteCond,&condAttr);
ptr->condition=0;
strcpy(ptr->data,"");
while(1)
{
pthread_mutex_lock(&ptr->mutex);
while(ptr->condition!=0)
{
printf("++++++++++parent waiting for condition become true!\n");
pthread_cond_wait(&ptr->isWriteCond,&ptr->mutex);
}
gets(ptr->data);
printf("++++++++++parent change Condition value:%d\n",++ptr->condition);
pthread_mutex_unlock(&ptr->mutex);
if(ptr->condition)
{
printf("++++++++++parent send signal for parent read data!\n");
pthread_cond_signal(&ptr->isReadCond);
}
printf("+++++++++++parent Current %d loop is over!\n\n\n",i);
if(strcmp(ptr->data,"exit")==0)
{
break;
}
i++;
}
shm_unlink(SHAREDMEMORYFILE);
exit(0);
return 0;
}