Linux信号量PV操作

多进程实现PV操作,子进程为生产者,仓库可以容纳5个物品,每次检查仓库是否满,若不满则执行P操作,生产一个物品放入仓库。父进程检验仓库是否空,若不空则消耗一个物品,执行V操作。sleep函数是随即设置生产或消费所用时间。

程序主要目的是演示信号量的使用,以备以后参考。 

#include<stdio.h>
#include<stdlib.h>

#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/types.h>

int main()
{
 int semID,ret,num;
 int sleepTime;
 struct sembuf buf;
 
 semID = semget(IPC_PRIVATE,1,0666);
 if(semID < 0)
 {
  printf("创建信号量出错/n");
  exit(1); 
 }
 
 if(fork() == 0)
 {  
  while(1)
  {
   num = semctl(semID,0,GETVAL,NULL);
   if(num < 5)
   {
    sleepTime = rand() % 5;
    sleep(sleepTime);
    
    buf.sem_num = 0;
    buf.sem_op = 1;
    buf.sem_flg = 0;
    
    ret = semop(semID,&buf,1);
    if(ret < 0)
    {
     printf("执行P操作失败!/n");
     exit(1);
    }
    
    num = semctl(semID,0,GETVAL,NULL);
    printf("生产者生产了一个物品放入了仓库...仓库中现有物品%d个/n",num);
   }
  }  
 }
 else
 {
  while(1)
  {
   num = semctl(semID,0,GETVAL,NULL);
   if(num > 0)
   {
    sleepTime = rand() % 5;
    sleep(sleepTime);
    
    buf.sem_num = 0;
    buf.sem_op = -1;
    buf.sem_flg = 0;
    
    ret = semop(semID,&buf,1);
    if(ret < 0)
    {
     printf("执行V操作失败!/n");
     exit(1);
    }
    
    num = semctl(semID,0,GETVAL,NULL);
    printf("消费者从仓库中消耗了一个物品...仓库中现有物品%d个/n",num);
   }
  }
 }

 return 0;
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值