#include<stdio.h>
#include<time.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <linux/sem.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#define MAXSEM 5
int full_id;
int empty_id;
int mutx_id;
int main(){
struct sembuf P,V;
union semun arg;
int *array;
int *sum;
int *set;
int *get;
array=(int*)mmap(NULL,sizeof( int )*5,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
sum=(int*)mmap(NULL, zeof( int ),PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS,-1,0);
get=(int*)mmap(NULL,sizeof( int ),PROT_READ|PROT_WRITE,MAP_SHAR ED|MAP_ANONYMOUS,-1,0);
set=(int*)mmap(NULL,sizeof( int ),PROT_READ|PROT_WRITE,MAP_SHAR ED|MAP_ANONYMOUS,-1,0);
*sum = 0;
*get = 0;
*set = 0;
full_id= semget(IPC_PRIVATE,1,IPC_CREAT|00666);
empty_id=semget(IPC_PRIVATE,1,IPC_CREAT|00666);
mutx_id=semget(IPC_PRIVATE,1,IPC_CREAT|00666);
arg.val = 0;
if(semctl(full_id , 0 , SETVAL , arg) == -1)
perror("semctl setval error");
arg.val = MAXSEM;
if(semctl(empty_id , 0 ,SETVAL , arg) == -1){
perror("semctl setval error");
}
arg.val = 1;
if(semctl(mutx_id , 0 ,SETVAL , arg) == -1){
perror("setctl setval error");
}
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)
{
semop( id , &P ,1 );
semop(mutx_id , &P , 1);
array[*(set)%MAXSEM] = i + 1;
printf("Producer %d\n", array[(*set)%MAXSEM]);
(*set)++;
semop(mutx_id , &V , 1);
semop(full_id , &V , 1);
i++;
}
sleep(10);
printf("Producer is over");
exit(0);
}
else if(fork()==0){
while(1)
{
semop(full_id , &P , 1);
semop(mutx_id , &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);
semop(mutx_id , &V , 1);
semop(empty_id , &V ,1 );
sleep(1);
}
printf("ConsumerA is over");
exit(0);
}
else{
if(fork()==0)
{
while(1)
{
semop(full_id , &P , 1);
semop(mutx_id , &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);
semop(mutx_id , &V , 1);
semop(empty_id , &V ,1 );
sleep(1);
}
printf("ConsumerB is over");
exit(0);
}
}
}
sleep(20);
return 0;
}
``
生产消费者
最新推荐文章于 2022-07-12 19:47:59 发布