天天看點

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;

}

繼續閱讀