生产消费者

#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;
}


``
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值