多程序實作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;
}