写:
#include<stdio.h>
#include<stdlib.h>
#include<semaphore.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<errno.h>
#include<sys/mman.h>
#include<pthread.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/shm.h>
#include<fcntl.h>
#include<string.h>
#define BUFFER_SIZE 12
#define sem_name "mysem"
struct People
{
int age;
char name[12];
};
int main()
{
int shmid;
sem_t* sem;
int age=10,i=1;
char buff[BUFFER_SIZE];
key_t shmkey;
shmkey=ftok("main.c",0);
//创建共享内存和信号量的IPC,创建的是命名信号量
sem=sem_open(sem_name,O_CREAT,0644,1);
// printf("--------------------------\n");
if(sem=SEM_FAILED)
{
printf("unable to create semephore!");
sem_unlink(sem_name);
exit(-1);
}
//创建或获得一个共享内存存储标识符
shmid=shmget(shmkey,1024,0666 | IPC_CREAT);
if(shmid==-1)
{
printf("create shm failed\n");
exit(1);
}
//将共享内存映射到当前进程的地址中,之后直接对进程中的地址addr的操作就是对共享内存的操作
struct People *addr=(struct People*)shmat(shmid,0,0);
if(addr==-1)
printf("shm shmat failed\n");
printf("----------------------\n");
//向共享内存写入数据
addr->age=0;//第一个元素作为可供消费的产品数不存放产品
printf("-----------------\n");
do
{
sem_wait(sem);
//memset(buff,0,BUFFER_SIZE);
printf("-----------------------\n");
printf("写进程:输入一些姓名(不超过10个字符)到共享内存(输入quit退出):\n");
if(fgets(buff,BUFFER_SIZE,stdin)==NULL)
{
perror("fgets");
sem_post(sem);
break;
}
strncpy((addr+i)->name,buff,strlen(buff)-1);//复制指定长度的字符串
(addr+i)->age=++age;
i++;
sem_post(sem);
}while(strncmp(buff,"quit",4)!=0);
//将共享内存与当前进程断开
if(shmdt(addr)==-1)
printf("shmdt failed\n");
sem_close(sem);
sem_unlink(sem_name);
return 0;
}
读:
#include<stdio.h>
#include<stdlib.h>
#include<semaphore.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<errno.h>
#include<sys/mman.h>
#include<pthread.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/shm.h>
#include<fcntl.h>
#include<string.h>
#define BUFFER_SIZE 10
#define sem_name "mysem"
int main()
{
int shmid;
sem_t* sem;
int i=1;
key_t shmkey;
shmkey=ftok("test.c",0);
struct People
{
char name[10];
int age;
};
//读取共享内存和信号量的IPC
sem=sem_open(sem_name,0,0644,0);
if(sem==SEM_FAILED)
{
printf("unable to open semaphore");
sem_close(sem);
exit(1);
}
shmid=shmget(shmkey,0,0666);
if(shmid==-1)
{
printf("create shm failed\n");
exit(0);
}
//将共享内存映射到当前进程的地址中,之后直接对进程中的地址addr的操作就是对共享内存的操作
struct People* addr=shmat(shmid,0,0);
if(addr==-1)
{
printf("shm shmat failed\n");
exit(0);
}
//读数据
do
{
printf("----------------------\n");
sem_wait(sem);
printf("-----------------------------------\n");
if(addr->age>0)
{
printf("\n读进程:绑定到共享内存%p:姓名 %d %s,年龄%d\n",addr,i,(addr+i)->name,(addr+i)->age);
addr->age--;
if(strncmp((addr+i)->name,"quit",4)==0)
break;
i++;
}
sem_post(sem);
sleep(1);
}while(1);
sem_close(sem);
//将共享内存与当前进程断开
if(shmdt(addr)==-1)
printf("shmdt failed\n");
if(shmctl(shmid,IPC_RMID,NULL)==-1)
printf("shmctl delete error\n");
return 0;
}