多进程实现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;
}