/*shmdata.c*/
#define TEXT_SZ 2048
struct shared_use_st
{
int written;
char text[TEXT_SZ];
};
/*shmread.c*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/shm.h>
#include "shmdata.c"
#include <string.h>
int main()
{
int running = 1;
void *shm = NULL;
struct shared_use_st * shared;
int shmid;
int i;
shmid = shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
if(shmid == -1)
{
fprintf(stderr,"shmget failed\n");
exit(EXIT_FAILURE);
}
shm = shmat(shmid,0,0);
if(shm == (void*)-1)
{
fprintf(stderr,"shmat failed\n");
exit(EXIT_FAILURE);
}
printf("\n memary attached at %d\n",(int)shm);
shared = (struct shared_use_st *)shm;
shared->written = 0;
while(running)
{
if(shared->written == 1)
{
printf("get string: %s\n",shared->text);
sleep(rand()%3);
shared->written = 2;
if(strncmp(shared->text,"end",3) == 0)
running = 0;
}
else if(shared->written == 2)
{
i = 0;
while(shared->text[i] != '\n')
{
if(shared->text[i] >= 'A' && shared->text[i] <= 'Z')
{
shared->text[i] += 32;
}
i++;
}
shared->written = 3;
printf("send string:%s\n",shared->text);
}
else
{
sleep(1);
}
}
if(shmdt(shm) == -1)
{
fprintf(stderr,"shmdt failed\n");
exit(EXIT_FAILURE);
}
if(shmctl(shmid,IPC_RMID,0) == -1)
{
fprintf(stderr,"stmctl failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
return 0;
}
/*shmwrite.c*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/shm.h>
#include "shmdata.c"
#include <string.h>
#define BUFFSIZE 2048
int main()
{
int running = 1;
void *shm = NULL;
struct shared_use_st * shared = NULL;
char buffer[BUFFSIZE + 1];
int shmid;
shmid = shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
if(shmid == -1)
{
fprintf(stderr,"shmget failed\n");
exit(EXIT_FAILURE);
}
shm = shmat(shmid,0,0);
if(shm == (void*)-1)
{
fprintf(stderr,"shmat failed\n");
exit(EXIT_FAILURE);
}
printf("\n memary attached at %d\n",(int)shm);
shared = (struct shared_use_st *)shm;
//shared->written = 0;
while(running)
{
if(shared->written == 0)
{
printf("send string:\n");
fgets(buffer,BUFFSIZE,stdin);
strncpy(shared->text,buffer,TEXT_SZ);
shared->written = 1;
if(strncmp(shared->text,"end",3) == 0)
running = 0;
}
else if(shared->written == 3)
{
printf("get string:%s\n",shared->text);
shared->written = 0;
}
else
{
sleep(1);
}
}
if(shmdt(shm) == -1)
{
fprintf(stderr,"shmdt failed\n");
exit(EXIT_FAILURE);
}
/* if(shmctl(shmid,IPC_RMID,0) == -1)
{
fprintf(stderr,"stmctl failed\n");
exit(EXIT_FAILURE);
}*/
sleep(2);
exit(EXIT_SUCCESS);
return 0;
}