天天看点

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;

}

继续阅读