代码备用
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<ctype.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h> //O_RDWR
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/shm.h>
#define BUFZE 32
typedef struct
{
char alpha;
}array;
pthread_mutex_t counter_clock = PTHREAD_MUTEX_INITIALIZER;
void *athread(void*);
void *bthread(void*);
int main(int ac,char*av[])
{
pthread_t t1,t2;
int shm_id;
array *p_map;
key_t key;
key = ftok(".", 0);
if(-1 == key)
{
perror("ftok error");
exit(1);
}
shm_id = shmget(key, BUFZE, IPC_CREAT|0666);
if(shm_id < 0)
{
perror("shmget error...");
exit(2);
}
printf("Successfully created segment:%d\n",shm_id);
system("ipcs -m");
p_map = (array*)shmat(shm_id, NULL, 0);
memset( p_map, '@', BUFZE);
pthread_create(&t1,NULL,athread,(void*)p_map);
pthread_create(&t2,NULL,bthread,(void*)p_map);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
if(shmdt(p_map) == -1)
{
perror("detach error");
exit(4);
}
/* delete the shared memory */
shmctl(shm_id, IPC_RMID, 0);
printf("main exit\n");
return 0;
}
void *athread(void*f)
{
int i;
char temp='A';
array *p_map=(array *)f;
printf("A: enter\n");
for(i=0; i < BUFZE; i++)
{
pthread_mutex_lock(&counter_clock);
printf("A: wrote [%d]:%c\n", i, temp);
memcpy((void*)&(*(p_map+i)).alpha, &temp, 1);
temp += 1;
pthread_mutex_unlock(&counter_clock);
}
printf("A: exit\n");
}
void *bthread(void*f)
{
int fd;
int i;
int n;
char tem;
array *p_map=(array *)f;
fd = open("./test.dat", O_RDWR|O_CREAT, 0700);
if(fd == -1)
{
perror("Failed to open/creat the file");
exit(5);
}
printf("B: enter\n");
for(i = 0;i < BUFZE; i++)
{
pthread_mutex_lock(&counter_clock);
tem = (*(p_map+i)).alpha;
n = write(fd, &tem, 1);
if(n == -1)
{
perror("Failed in the writing thread");
exit(6);
}
printf("B: read [%d]:%c\n", i, tem);
pthread_mutex_unlock(&counter_clock);
}
printf("B: exit\n");
}