Linux实验全纪录之 生产者-消费者问题

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值