#include <sys/mman.h>
#include <sys/types.h>
#include <linux/sem.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>
#define MAXSEM 5
/*声明3个信号量*/
int fullid;
int emptyid;
int mutxid;
int main()
{
struct sembuf P,V;
union semun arg;
/*声明共享主存*/
int *array;
int *sum;
int *set;
int *get;
/*将array,sum,set,get映射到共享主存*/
array =(int *)mmap(NULL,sizeof(int)*MAXSEM,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
sum=(int *)mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
set=(int *)mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
get=(int *)mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
/*创建信号量*/
fullid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);
emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);
mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);
/*为信号量赋值*/
arg.val=0;
if(semctl(fullid,0,SETVAL,arg)==-1)perror("semctl setval error");
arg.val=MAXSEM;
if(semctl(emptyid,0,SETVAL,arg)==-1)perror("semctl setval error");
arg.val=1;
if(semctl(mutxid,0,SETVAL,arg)==-1)perror("semctl setval error");
/*初始化P,V操作*/
V.sem_num=0;/*在数组中信号量的索引值*/
V.sem_op=1;/*信号量操作值*/
V.sem_flg=SEM_UNDO;/*操作标志*/
P.sem_num=0;
P.sem_op=-1;
P.sem_flg=SEM_UNDO;
/*创建生产者进程*/
if(fork()==0)
{
int i=0;
while(i<100)
{
/*对emptyid和mutxid执行P操作*/
semop(emptyid,&P,1);
semop(mutxid,&P,1);
array[(*set)%MAXSEM]=i+1;
printf("Product %d\n",array[(*set)%MAXSEM]);
(*set)++;
/*对fullid和mutxid执行V操作*/
semop(mutxid,&V,1);
semop(fullid,&V,1);
i++;
}
/*休眠一段时间*/
sleep(5);
/*打印“生产者结束”提示信息*/
printf("Producter is over.\n");
exit(0);
/*退出*/
}else
{
/*创建消费者进程A*/
if(fork()==0)
{
while(1)
{
/*对fullid和mutxid执行P操作*/
semop(fullid,&P,1);
semop(mutxid,&P,1);
if(*get==100)
break;
*sum+=array[(*get)%MAXSEM];
printf("The ComsumerA Get Number %d\n",array[(*get)%MAXSEM]);
(*get)++;
if(get==100)
printf("The sum is %d\n",sum);
/*对emptyid和mutxid执行V操作*/
semop(mutxid,&V,1);
semop(emptyid,&V,1);
/*休眠一段时间*/
sleep(5);
}
/*打印“消费者结束”提示信息*/
printf("ComsumerA is over.\n");
exit(0);
/*退出*/
}else
{
/*创建消费者进程B*/
if(fork()==0)
{
while(1)
{
/*对fullid和mutxid执行P操作*/
semop(fullid,&P,1);
semop(mutxid,&P,1);
if(*get==100)
break;
*sum+=array[(*get)%MAXSEM];
printf("The ComsumerB Get Number %d\n",array[(*get)%MAXSEM]);
(*get)++;
if(get==100)
printf("The sum is %d\n",sum);
/*对emptyid和mutxid执行V操作*/
semop(mutxid,&V,1);
semop(emptyid,&V,1);
/*休眠一段时间*/
}
printf("ConsumerB is over\n");
exit(0);
}
}
}
}
Linux实验全纪录之 生产者-消费者问题
最新推荐文章于 2024-04-22 13:45:58 发布